为什么使用 new 运算符而不是 std::vector?
Why using new operator instead of std::vector?
New
运算符经常让我感到困惑,如果我忘记使用 delete
,使用它会导致内存泄漏。每次我必须在编译时不知道其长度的情况下分配一个对象数组时,我只使用 std::vector
。使用 new
有什么意义?
此外,为什么我需要使用 new
运算符来为对象的一个实例分配 space?
你是对的。裸体 new
是 evil.
现在它的主要用途是作为高级构造下面的低级管道。所有 vector
s 和 make_unique
s 等等最终都会在标准库中调用 new
。
此外,低级部分早于高级部分。在智能指针出现之前,new
在很多情况下是唯一的选择。事实上,std::make_unique
是在C++14才引入的,所以C++11即使使用unique_ptr
进行资源清理,也需要调用new
。
总是喜欢标准容器。它们具有明确定义的复制语义,是异常安全的,并且可以正确发布。
按值创建的对象(即在堆栈上)在超出范围时会自动消亡。析构函数调用由编译器插入,内存在函数 return.
时自动释放
请注意,C++ 不会被垃圾回收。因此,对于每个new
,必须有一个对应的delete
。如果你没把这个delete
放进去,那就是内存泄漏了。
要在大多数代码中正常使用动态数组,请使用std::vector
。这显然是默认设置,可以防止许多问题。
但是,当您知道自己在做什么并且希望在特殊情况下获得一些性能提升时,您可能想看看 new
或 malloc
是否可以帮助您。最好您制作一个新的专用容器,这样人们就可以继续将其用作普通容器。或者更好的是,您可以尝试为现有容器制作分配器。正如您可能注意到的那样,这需要一些时间并且可能需要调试,因此除非有实际需要,否则请坚持使用标准容器和动态数组,这是 std::vector
.
我认为你的问题与两件事有关:
new运算符的用法:举个例子。使用 "new" 和 "delete" 管理内存让程序员可以控制程序。有些程序语言有Garbage Collection,但是我们不知道GC什么时候开始工作,这就造成了不确定性。然而,对于要求低延迟的系统,这种不确定性会带来麻烦。
使用"vector",我们不必使用new 创建动态数组,这很好并且导致的bug 更少。实际上最好使用向量而不是动态数组。但是我不认为vector的使用和new的使用有冲突。它只会造成您可以避免使用新的情况。
请检查RAII的概念。对学习C++很有用
New
运算符经常让我感到困惑,如果我忘记使用 delete
,使用它会导致内存泄漏。每次我必须在编译时不知道其长度的情况下分配一个对象数组时,我只使用 std::vector
。使用 new
有什么意义?
此外,为什么我需要使用 new
运算符来为对象的一个实例分配 space?
你是对的。裸体 new
是 evil.
现在它的主要用途是作为高级构造下面的低级管道。所有 vector
s 和 make_unique
s 等等最终都会在标准库中调用 new
。
此外,低级部分早于高级部分。在智能指针出现之前,new
在很多情况下是唯一的选择。事实上,std::make_unique
是在C++14才引入的,所以C++11即使使用unique_ptr
进行资源清理,也需要调用new
。
总是喜欢标准容器。它们具有明确定义的复制语义,是异常安全的,并且可以正确发布。
按值创建的对象(即在堆栈上)在超出范围时会自动消亡。析构函数调用由编译器插入,内存在函数 return.
时自动释放请注意,C++ 不会被垃圾回收。因此,对于每个new
,必须有一个对应的delete
。如果你没把这个delete
放进去,那就是内存泄漏了。
要在大多数代码中正常使用动态数组,请使用std::vector
。这显然是默认设置,可以防止许多问题。
但是,当您知道自己在做什么并且希望在特殊情况下获得一些性能提升时,您可能想看看 new
或 malloc
是否可以帮助您。最好您制作一个新的专用容器,这样人们就可以继续将其用作普通容器。或者更好的是,您可以尝试为现有容器制作分配器。正如您可能注意到的那样,这需要一些时间并且可能需要调试,因此除非有实际需要,否则请坚持使用标准容器和动态数组,这是 std::vector
.
我认为你的问题与两件事有关:
new运算符的用法:举个例子。使用 "new" 和 "delete" 管理内存让程序员可以控制程序。有些程序语言有Garbage Collection,但是我们不知道GC什么时候开始工作,这就造成了不确定性。然而,对于要求低延迟的系统,这种不确定性会带来麻烦。
使用"vector",我们不必使用new 创建动态数组,这很好并且导致的bug 更少。实际上最好使用向量而不是动态数组。但是我不认为vector的使用和new的使用有冲突。它只会造成您可以避免使用新的情况。
请检查RAII的概念。对学习C++很有用