gpt4 book ai didi

c++ - 构造函数异常和内存泄漏

转载 作者:行者123 更新时间:2023-11-30 03:17:31 25 4
gpt4 key购买 nike

我有一个分配内存并可以在构造函数中抛出异常的类,例如:

class A
{
int *x;
public:
A () { x = new int; throw 0;}
~A () { delete x; }
};

我想动态创建此类的对象。我应该怎么做才能防止内存泄漏?我尝试在 try block 中创建对象并在 catch block 中删除,但地址清理器已报告 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,两种 sanitizer 都是无声的。我想知道是否仍然存在内存泄漏,如果是,如何解决?

int main()
{
A *a;
a = new A; // terminate called after throwing an instance of 'int'
}

UPD:是的,我知道共享指针。我的问题主要是关于最后一个案例(没有处理异常)。为什么 sanitizer 是无声的?只是泄漏 sanitizer 流还是真的没有泄漏?

最佳答案

以下部分代码无效:

int main()
{
A *a;
try { a = new A; }
catch(int) { delete a; } // AddressSanitizer: SEGV on unknown address
}

如果在运行 new A 时抛出异常,那么在异常发生之前 A 设法构建的任何东西都会被破坏。此外,a 的内存会自动释放。

在上面的例子中,当异常被抛出时,指针a甚至没有被赋值一次并且处于未初始化状态。

解决泄漏最安全的方法是使用 std::unique_ptr

class A
{
std::unique_ptr<int> x;
public:
A (): x(std::make_unique<int>()} { throw 0;}
A(A&&) = default;
A& operator=(A&&) = default;
A(const A &); // do something smart here
A& operator=(const A &); // do something smart here
~A () { }
};

使用 unique_ptr 异常之前构造的任何内容都将自动释放。

关于c++ - 构造函数异常和内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55398804/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com