【发布时间】:2019-08-19 07:05:08
【问题描述】:
我有一个分配内存的类,可以在构造函数中抛出异常,例如:
class A
{
int *x;
public:
A () { x = new int; throw 0;}
~A () { delete x; }
};
我想动态创建此类的对象。我应该怎么做才能防止内存泄漏?
我尝试在try 块中创建对象并在catch 块中删除,但地址清理器报告了SEGV on unknown address。
int main()
{
A *a;
try { a = new A; }
catch(int) { delete a; } // AddressSanitizer: SEGV on unknown address
}
如果不删除对象,我们(显然)会发生内存泄漏,并且泄漏清理器会报告。
int main()
{
A *a;
try { a = new A; }
catch(int) {} // LeakSanitizer: detected memory leaks
}
但是,如果没有try - catch,两种消毒剂都会保持沉默。我想知道是否仍然存在内存泄漏,如果是,如何解决?
int main()
{
A *a;
a = new A; // terminate called after throwing an instance of 'int'
}
UPD:是的,我知道共享指针。我的问题主要是关于最后一种情况(不处理异常)。为什么消毒剂无声?它只是泄漏消毒剂流动还是真的没有泄漏?
【问题讨论】:
-
除了之前的评论,这可能会给你一些许可What happens if a constructor throws an exception?
-
这是关于 Asan、内存泄漏的存在还是预防的问题?
-
如果你的构造函数分配了一些东西,并抛出了一个异常,你的构造函数有责任释放那个东西。否则一切都会一团糟。您不能依赖析构函数,因为从逻辑上讲,析构函数只能在完全构造的对象上调用,并且如果构造函数未正常完成(即抛出),则该对象不能算作“完全构造”。
标签: c++ exception memory-leaks address-sanitizer