c++ - 如果我在 C++ 中使用堆,我做错了什么吗?

标签 c++ raii

越多I read关于 RAII,我理解使用堆栈是确保代码异常安全的方法。

这是否意味着每次我在我的代码中执行 new() 时,我都做错了什么,因为有更好的方法可以使用 RAII 原则来做到这一点?

最佳答案

如果您使用 new,您不一定做错什么,但值得检查您是否做对了。

  • new 表达式的结果应该立即置于智能指针的控制之下,通常是直接将其传递给构造函数。
  • 如果该智能指针是一个shared_ptr,那么您可能做错了。您可能应该改用 make_shared。有些情况你不应该(对大对象使用 weak_ptr),有些情况你不能(没有 Boost 的 C++03)。
  • 如果您使用delete,那么您基本上就做错了,除非您正在编写自己的智能指针类。即便如此,您的智能指针也可以使用另一个智能指针来保存工作。
  • 这不是必需的,但是如果您使用 new 仅仅是因为对象“对于堆栈来说太大了”,请考虑使用 编写一个充当对象句柄的类unique_ptrscoped_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/

相关文章:

c++ - 检查一个点是否已经在 vector/列表中——性能

c++ - 如何将 RTP 数据包与其他数据包分开

c++ - C++ 中带字符串的输入验证循环

c++ - 在析构函数中获取锁是一个坏主意吗?

c++ - 在 C++11 的析构函数中锁定互斥量

c++ - 类成员,隐式初始化为零?

c++ - 函数 sqlite3_open_v2 文件路径

c++ - 使用 Linux Eclipse,我能否以编程方式告诉我正在调试器 (gdb) 中执行?

c++ - 可以使资源无效的RAII

c++ - 在 C++ 中不使用括号类的原因可能是什么?