越多I read关于 RAII,我理解使用堆栈是确保代码异常安全的方法。
这是否意味着每次我在我的代码中执行 new()
时,我都做错了什么,因为有更好的方法可以使用 RAII 原则来做到这一点?
最佳答案
如果您使用 new
,您不一定做错什么,但值得检查您是否做对了。
new
表达式的结果应该立即置于智能指针的控制之下,通常是直接将其传递给构造函数。- 如果该智能指针是一个
shared_ptr
,那么您可能做错了。您可能应该改用make_shared
。有些情况你不应该(对大对象使用weak_ptr
),有些情况你不能(没有 Boost 的 C++03)。 - 如果您使用
delete
,那么您基本上就做错了,除非您正在编写自己的智能指针类。即便如此,您的智能指针也可以使用另一个智能指针来保存工作。 - 这不是必需的,但是如果您使用
new
仅仅是因为对象“对于堆栈来说太大了”,请考虑使用编写一个充当对象句柄的类unique_ptr
或scoped_ptr
来管理它,这样从用户的角度来看,他们处理的对象是自动变量。如果您愿意,可以将其扩展到完整的 PImpl 习惯用法。即使您不想要另一个类,也可以考虑创建对象并向其返回unique_ptr
的函数,然后您可以像auto foohandle = give_me_a_foo();
。然后give_me_a_foo
包含new
,但其他用户代码没有,并且您鼓励将内容自动填充到 RAII 对象中的做法。
在 C++ 中有替代 RAII 的资源管理策略,但如果您正在使用它们,您就会知道它,这会影响什么算作“错误”。
关于c++ - 如果我在 C++ 中使用堆,我做错了什么吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12433711/