为什么使用 new 运算符而不是 std::vector?

Why using new operator instead of std::vector?

New 运算符经常让我感到困惑,如果我忘记使用 delete,使用它会导致内存泄漏。每次我必须在编译时不知道其长度的情况下分配一个对象数组时,我只使用 std::vector。使用 new 有什么意义?

此外,为什么我需要使用 new 运算符来为对象的一个​​实例分配 space?

你是对的。裸体 newevil.

现在它的主要用途是作为高级构造下面的低级管道。所有 vectors 和 make_uniques 等等最终都会在标准库中调用 new

此外,低级部分早于高级部分。在智能指针出现之前,new 在很多情况下是唯一的选择。事实上,std::make_unique是在C++14才引入的,所以C++11即使使用unique_ptr进行资源清理,也需要调用new

总是喜欢标准容器。它们具有明确定义的复制语义,是异常安全的,并且可以正确发布。

按值创建的对象(即在堆栈上)在超出范围时会自动消亡。析构函数调用由编译器插入,内存在函数 return.

时自动释放

请注意,C++ 不会被垃圾回收。因此,对于每个new,必须有一个对应的delete。如果你没把这个delete放进去,那就是内存泄漏了。

要在大多数代码中正常使用动态数组,请使用std::vector。这显然是默认设置,可以防止许多问题。

但是,当您知道自己在做什么并且希望在特殊情况下获得一些性能提升时,您可能想看看 newmalloc 是否可以帮助您。最好您制作一个新的专用容器,这样人们就可以继续将其用作普通容器。或者更好的是,您可以尝试为现有容器制作分配器。正如您可能注意到的那样,这需要一些时间并且可能需要调试,因此除非有实际需要,否则请坚持使用标准容器和动态数组,这是 std::vector.

我认为你的问题与两件事有关:

  1. new运算符的用法:举个例子。使用 "new" 和 "delete" 管理内存让程序员可以控制程序。有些程序语言有Garbage Collection,但是我们不知道GC什么时候开始工作,这就造成了不确定性。然而,对于要求低延迟的系统,这种不确定性会带来麻烦。

  2. 使用"vector",我们不必使用new 创建动态数组,这很好并且导致的bug 更少。实际上最好使用向量而不是动态数组。但是我不认为vector的使用和new的使用有冲突。它只会造成您可以避免使用新的情况。

  3. 请检查RAII的概念。对学习C++很有用