为什么使用"新"是个坏主意?

Ste*_*ins 5 c++

可能重复:
在C++中,为什么要new尽量少用?

在C++中实例化一个类时使用'new'真是个坏主意吗? 在这里找到.

我知道使用原始指针是不明智的,但为什么有一个'新'关键字,当它是如此糟糕的做法?或者是吗?

Ker*_* SB 16

关键在于new,就像怀孕一样,创建一个手动管理的资源(即由管理),因此它带来了责任.

C++是一种用于编写库的语言,每当你看到一个责任时,"C++"方法就是编写一个库元素来处理这个,而且只有这个,责任.对于动态内存分配,这些库组件已经存在,并且概括地称为"智能指针"; 你想看看std::unique_ptrstd::shared_ptr(或他们的TR1或升压当量).

在编写那些单一责任的构建模块时,您确实需要说newdelete.但是你这样做了一次,你仔细考虑它并确保你提供正确的拷贝,赋值和破坏语义.(从异常安全的角度来看,单一责任至关重要,因为一次处理多个单一资源是非常不可扩展的.)

一旦将所有因素都考虑在适当的构建块中,就可以将这些块组合成越来越大的代码系统,但此时您不再需要再承担任何手动操作,因为构建块已经为您完成了此操作.

由于标准库为绝大多数用例(动态数组,智能指针,文件句柄,字符串)提供了资源管理类,因此重点是一个经过精心设计和制作的C++项目几乎不需要任何类型的手册资源管理,包括使用new.所有处理程序对象都是自动的(作用域),或其他类的成员,这些类的实例又由某人限定或管理.

考虑到这一点,您应该说的唯一时间new是创建新的资源管理对象; 虽然那时并不总是必要的:

std::unique_ptr<Foo> p1(new Foo(1, 'a', -2.5));   // unique pointer
std::shared_ptr<Foo> p2(new Foo(1, 'a', -2.5));   // shared pointer
auto p3 = std::make_shared<Foo>(1, 'a', -2.5);    // equivalent to p2, but better
Run Code Online (Sandbox Code Playgroud)

更新:我想我可能只解决了OP的一半问题.许多来自其他语言的人似乎都认为任何对象都必须使用new-type表达式进行实例化.在接近C++时,这本身就是一种非常无益的心态:

C++中的关键区别在于对象生存期或"存储类".这可以是以下之一:自动(范围),静态(永久)或动态(手动).全局变量具有静态生存期.绝大多数变量(Foo x;在本地范围内声明)具有自动生命周期.我们只使用表达式进行动态存储new.从另一种OO语言转向C++时,最重要的事情是大多数对象只需要有自动生命周期,因此从来没有什么可担心的.

所以第一个实现应该是"C++很少需要动态存储".我觉得这可能是OP问题的一部分.问题可能更好地表达为"动态分配对象是一个非常糟糕的主意吗?".只有经过你决定,你真的需要我们去讨论正确的你是否应该说动态存储newdelete了很多,或者有较好的替代品,这是我原来的答复点.

  • 用于比较"新"与无保护性行为的+1,这有助于解释为什么C++聊天室倾向于经常讨论. (5认同)