Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
原语的Malloc与New 在C++中,我理解了使用新< /COD>对 MalOC 的好处。但是对于诸如基本数据类型(非数组)int、float等特定情况,使用malloc是否比new更快_C++_Arrays_Memory Management_Malloc_New Operator - Fatal编程技术网

原语的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
都是一种大罪MalCu和 < < />代码>,因为它不能保证使用<代码>免费< /代码>来释放分配给<>代码>运算符new < /C> >的内存(这是最终所有托管内存类使用的),也不能使用
操作符delete
来释放分配给
malloc
的内存

一个典型的例子是(不要混淆):它使用一个指向
char*
变量的指针;该变量必须指向分配了
malloc
的内存块(也可以为NULL,在这种情况下
getline
将为您调用
malloc
);调用完
getline
后,您需要调用该变量的
free

同样,如果你正在编写一个库,那么在内部使用C++是有意义的,但是为你的外部调用方定义一个<代码>外部“C”< /C> > API,因为这给了你更好的二进制接口稳定性和跨语言互操作性。如果您将堆分配的POD对象返回给调用者,您可能希望让他们用

免费
解除分配这些对象;他们不必使用
delete
,当不需要析构函数类型的操作时,让他们调用
YourLibraryFree
是不符合逻辑的

在实现可调整大小的容器对象时,可能仍然需要使用
malloc
,因为对于
operator new
,没有与
realloc
等效的对象

但是,正如其他答案所说,当您没有这种接口约束约束时,请使用一个托管内存类。

已经给出了正确的答案:仅在与C接口交互时使用
malloc()
/
free()
我不会重复这些细节,我将回答性能问题

真相