原语的Malloc与New 在C++中,我理解了使用新< /COD>对 MalOC 的好处。但是对于诸如基本数据类型(非数组)int、float等特定情况,使用malloc是否比new更快
尽管如此,如果我们正在分配一个数组以便可以使用原语的Malloc与New 在C++中,我理解了使用新< /COD>对 MalOC 的好处。但是对于诸如基本数据类型(非数组)int、float等特定情况,使用malloc是否比new更快,c++,arrays,memory-management,malloc,new-operator,C++,Arrays,Memory Management,Malloc,New Operator,尽管如此,如果我们正在分配一个数组以便可以使用delete[],即使对于原语,也始终建议使用new 但对于非数组分配,我认为不会有任何构造函数调用int?因为,new操作符分配内存,检查是否分配了内存,然后调用构造函数。但仅仅对于原语非数组堆分配,使用malloc是否比new更好 请告知。最好使用新的。如果您使用malloc,您仍然需要手动检查是否分配了空间 在现代C++中,可以使用智能指针。使用make_unique和make_shared您永远不会显式调用new STD::UnQuyGIPP
delete[]
,即使对于原语,也始终建议使用new
但对于非数组分配,我认为不会有任何构造函数调用int
?因为,new
操作符分配内存,检查是否分配了内存,然后调用构造函数。但仅仅对于原语非数组堆分配,使用malloc
是否比new
更好
请告知。最好使用
新的
。如果您使用malloc
,您仍然需要手动检查是否分配了空间
在现代C++中,可以使用智能指针。使用
make_unique
和make_shared
您永远不会显式调用new
<代码> STD::UnQuyGIPPTR <代码>不大于基础指针,使用它的开销最小。 < P>在C++中永远不要使用<代码> MalCal。切勿使用new
,除非您正在实现低级内存管理原语
建议是:
- 问问自己:“我需要动态内存分配吗?”。很多时候,您可能不需要它-更喜欢值而不是指针,并尝试使用堆栈
- 如果您确实需要动态内存分配,请自问“谁将拥有分配的内存/对象?”
- 如果你只需要一个所有者(很可能),你应该
使用。这是一个零成本的抽象过程
/新建
。(可以指定不同的deallocator。)删除
- 如果您需要共享所有权,您应该使用。这不是一个零成本的抽象,因为它使用原子操作和额外的“控制块”来跟踪所有所有者
- 如果你只需要一个所有者(很可能),你应该
使用。这是一个零成本的抽象过程
特别是在处理阵列时,标准库提供了两种功能强大且安全的抽象,不需要任何手动内存管理:
- :类型为
的T
元素的固定数组N
- :类型为
的可调整大小的元素数组T
std::array
和std::vector
应满足您99%的“阵列需求”
还有一件更重要的事情:标准库提供了和,它应该总是用来创建智能指针实例。有几个很好的理由:
- 更短-无需重复
(例如T
),无需使用std::unique_ptr{new T}
new
- 更加异常安全。它们可以防止由于函数调用中缺少定义良好的求值顺序而导致的潜在内存泄漏。例如
f(std::shared_ptr<int>(new int(42)), g())
可以按以下顺序进行评估:f(std::shared_ptr(newint(42)),g())
newint(42)
g()
如果
g()
抛出,则int
会泄漏
std::make_shared
——使用它而不是std::shared_ptr
直接允许实现对对象和控制块执行单个分配new
还是malloc
”的答案是单一责任规则
资源管理应该由一种将此作为唯一目的的类型来完成。这些类已经存在,例如
unique\u ptr
,vector
等
直接使用
malloc
或new
都是一种大罪当使用纯C与API交互时,在C++中仍然需要使用操作符delete
来释放分配给malloc
的内存
一个典型的例子是(不要混淆):它使用一个指向char*
变量的指针;该变量必须指向分配了malloc
的内存块(也可以为NULL,在这种情况下getline
将为您调用malloc
);调用完getline
后,您需要调用该变量的free
同样,如果你正在编写一个库,那么在内部使用C++是有意义的,但是为你的外部调用方定义一个<代码>外部“C”< /C> > API,因为这给了你更好的二进制接口稳定性和跨语言互操作性。如果您将堆分配的POD对象返回给调用者,您可能希望让他们用
免费解除分配这些对象;他们不必使用delete
,当不需要析构函数类型的操作时,让他们调用YourLibraryFree
是不符合逻辑的
在实现可调整大小的容器对象时,可能仍然需要使用malloc
,因为对于operator new
,没有与realloc
等效的对象
但是,正如其他答案所说,当您没有这种接口约束约束时,请使用一个托管内存类。已经给出了正确的答案:仅在与C接口交互时使用malloc()
/free()
我不会重复这些细节,我将回答性能问题
真相