所有优秀的C ++程序员都知道如何避免泄漏内存(或套接字等资源):
std::auto_ptr
,boost::shared_ptr
。但是,内存泄漏仍然存在。发现时指出最常见的问题 程序中的内存泄漏,即使您使用了上述技术。
我开始:
有时您忘记将基类的析构函数定义为虚拟。所以派生类引用的所有派生类都没有被正确销毁并因此泄露。
答案 0 :(得分:5)
除了泄漏之外,还有更多类型的错误。按从最坏到最好的顺序:
数据存储在不应该存在的区域。这导致大多数安全问题和是最难追查的。
X
派生的类型的对象存储到为基本类型X
保留的数组元素,X
的大小大于其基数的大小new
/ free
,malloc
/ delete
)delete
或free
在同一指针上调用两次。程序不再使用的内存仍然已分配。
new[]
/ delete
而不是new[]
/ delete[]
。smart_ptr
时可能会发生,而不会将weak_ptr
用于循环链接。 答案 1 :(得分:2)
循环引用很常见,std::auto_ptr
或boost::shared_ptr
无法解决这些问题。
你的名单上的(2)没有替代品,它正在使用你的大脑。
答案 2 :(得分:2)
答案 3 :(得分:1)
熟悉自动垃圾收集的人(通过智能指针)所犯的错误:
class A {
public:
int avery_useful_calculation()const { return 4; }
private:
// class shouldn't be instantiated as an automatic variable (on stack)
virtual ~A(){}
};
// client code: needs a very useful calculation
int i = (new A)->avery_useful_calculation();
答案 4 :(得分:0)
也许我超出范围,但我有一些奇怪的错误试图“删除”未初始化的指针。
为了“避免”内存泄漏,如果实现了,我使用try {} __finally {}
结构(但是如果在子子调用中引发异常,我会在某处读取它可能是低效的)