像前面抛异常的捕获try、catch就非常容易造成内存泄漏。
#include <iostream>
#include <stdexcept>
void causeMemoryLeak() {
int* ptr = new int(42); // 动态分配内存
// 模拟抛出异常
throw std::runtime_error("Something went wrong!");
// 此处如果异常未抛出,应该释放内存
delete ptr;
}
int main() {
try {
causeMemoryLeak();
} catch (const std::exception& e) {
std::cout << "Caught exception: " << e.what() << std::endl;
// 这里 ptr 的内存没有被释放,造成内存泄漏
}
return 0;
}
前面的C++异常中聊过,当throw执行时,throw后面的语句将不再被执行。所以当这里抛出runtime_error异常后,导致delete per被跳过。造成了内存泄漏。虽然我们可以通过对代码进行优化,以防止出现这种情况。但是如果用智能指针来对资源进行管理就会非常的方便。
C++98提供了std::auto_ptr
C++11提供了std::unique_ptr 、std::shared_ptr、std::weak_ptr