gpt4 book ai didi

c++ - 在 C++ 中避免内存泄漏和异常

转载 作者:行者123 更新时间:2023-11-30 01:30:53 24 4
gpt4 key购买 nike

我在堆上分配对象,在某些情况下我将它们组合成一个新对象(我的 Foo 类主要包含 2-3 个 STL 容器)。(另一种方法是使用拷贝,但我想那样效率会较低。)

这些操作可能会失败,因此可能会抛出异常。除非我在每次抛出异常时释放动态内存,否则我会发生内存泄漏。

auto_ptr/unique_ptr 在这种情况下有意义吗?我猜是这样,因为 Combine 是一个“接收器”,但如果我想在调用 Combine 后使用 f1 和 f2 怎么办?

谢谢!

这是我的代码:

Foo* MakeFoo( )
{
Foo* foo = 0;

Foo* f1 = SimpleFoo( );
if( f1 )
{
Foo* f2 = SimpleFoo( );
if( f2 )
{
Foo* combined = Combine( f1, f2 );
delete f2;
delete f1;
}
else
foo = f1;
}
delete foo;
}

Foo* SimpleFoo( )
{
Foo* f = 0;

if( something )
{
f = new Foo;
if( somethingElse )
throw std::runtime_error( "Error" ); // Memory leak
}

return f;
}

Foo* Combine( const Foo* f1, const Foo* f2 )
{
assert( f1 );
assert( f2 );

// Memory leak in MakeFoo( )
if( something )
throw std::runtime_error( "Error" );

Foo* foo = new Foo;

// Maybe one could also simply modify f1
foo->Add( *f1 );
foo->Add( *f2 );

return foo;
}

最佳答案

unique_ptr 在这里可以帮助进行内存管理,但是除非你在 Foo::Add 的容器中内置了移动支持,否则你会想使用 shared_ptr,因为你不能复制 unique_ptr 的内容,只能移动所有权

如果你的 STL 有 unique_ptr 和 shared_ptr 你可能不应该使用 auto_ptr。

shared_ptr 的 typedef 也会清理一些代码。

关于c++ - 在 C++ 中避免内存泄漏和异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3954176/

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