关于new和delete的用法,以及Stroustrup的建议

use*_*311 30 c++ c++11

关于new和delete的用法,以及Stroustrup的建议......

他说的是(但不完全是,这来自我的书中的笔记):

根据经验,new属于构造函数和类似操作的delete属于析构函数.此外,new通常用于资源句柄的参数.否则,请避免使用newdelete,而是使用资源句柄(智能指针).

我想知道更有经验的C++ 11用户是否真的应用了这个.

我对此的印象是,哇这似乎是一个非常酷的规则.但是,就任何一般规则而言,我都怀疑.在一天结束时,您将最终使用new并在必要时删除.但也许这个规则是一个我不知道的好准则.

Jos*_*eld 48

这是一个很好的规则.实际上,您可以new通过使用适当的make_函数来避免在智能指针的参数中使用.例如,而不是:

std::shared_ptr<int> p(new int(5));
Run Code Online (Sandbox Code Playgroud)

你经常可以这样做:

auto p = std::make_shared<int>(5);
Run Code Online (Sandbox Code Playgroud)

这也有更多例外安全的好处.虽然a std::make_unique还不存在,但计划进入C++ 14(它已经在工作草案中)了.如果你现在想要它,有一些现有的实现.

你可以更进一步,甚至避免使用new,并delete在构造函数和析构函数.如果你总是在智能指针中包装动态分配的对象,即使它们是类成员,你根本不需要管理你自己的内存.参见零度规则.这个想法是,你的类不负责实现任何形式的所有权语义(SRP) - 这就是智能指针的用途.那么理论上你永远不必编写复制/移动构造函数,复制/移动赋值运算符或析构函数,因为隐式定义的函数通常会做适当的事情.

  • +1用于说明零的规则.使默认ctors和assigment运算符工作是智能指针和资源句柄的最佳好处之一.我不记得上次写一个析构函数了.如果你以这种方式编写类(由处理程序管理的资源),你可以避免许多常见的C++头痛,这些问题涉及一类不同的ctors,赋值运算符等等(而这个问题在C++ 11中是最糟糕的,其中三规则是五的规则) (4认同)

Die*_*ühl 14

看起来更像是一个民意调查而不是一个问题,但在这里它是:在应用程序代码中我通常根本不使用new.由于我们的编码指南,代码确实使用指针,但这些"裸"指针中没有一个实际上是转移所有权.所有对象都归其他对象所有.

公平地说,当需要分配对象时,分配通常使用std::make_shared<T>(...)在应用程序代码中有时会出现的道德等效的东西.这种相当彻底缺失new(或类似)的一个主要原因是对象通常使用有状态分配器进行分配,而不是通过资源管理器实际上恰好相当复杂.因此,new在应用程序代码中使用或其放置版本的直接存储器分配几乎没有地方.

在某些基础架构代码中,特别是在创建自定义容器时,情况略有不同:存在分配的内存(来自分配器并使用放置初始化new).但是,即使存在内存分配和对象初始化的任何结果,也会立即传递给资源管理器.基本上,我无法应对明确的资源管理,使用资源管理器只是让我放心了必要的工作.