内存泄漏是 C++ 中常见的问题之一,可能导致程序运行时资源消耗过大、性能下降,甚至程序崩溃。
内存泄漏的原因
1. 未释放动态分配的内存
在 C++ 中,通过 new
操作符分配的内存需要手动使用 delete
操作符进行释放。如果忘记或者由于某种原因未释放内存,就会导致内存泄漏。
cppCopy code
int* myArray = new int[10];
// 漏掉 delete 操作
2. 循环引用
在使用智能指针时,如果存在循环引用,指针之间的引用计数可能永远不会降为零,导致内存泄漏。
cppCopy code
class Node {
public:
std::shared_ptr<Node> next;
};
std::shared_ptr<Node> node1 = std::make_shared<Node>();
std::shared_ptr<Node> node2 = std::make_shared<Node>();
node1->next = node2;
node2->next = node1; // 循环引用
3. 异常导致的资源泄漏
在发生异常的情况下,如果没有适当地释放资源,就可能发生内存泄漏。在异常发生时,确保已经分配的资源得到正确释放是很重要的。
cppCopy code
try {
int* myData = new int[100];
// 可能会发生异常
// ...
delete[] myData; // 在发生异常时可能不会执行到这里
} catch (...) {
// 处理异常
}
4.虚析构
请问:在STL中std::string等容器能否被继承,为什么?
回答:不能,因为继承需要父类析构函数为virtual
,而string类它的析构函数没有提供虚函数。事实上**std::vector
、std::list
、std::deque
、std::set
、std::map
等容器都不是设计为可继承的。它们的设计目标是提供高效、通用的数据结构,而不是作为基类供其他类进行继承。
如果继承了string类会怎样?
答案:这样会引起内存泄漏
。
例如:
class Base {
public:
Base(){
buffer_ = new char[10