【问题标题】:What is the difference between these two lines of code [duplicate]这两行代码有什么区别[重复]
【发布时间】:2019-12-29 02:48:45
【问题描述】:

有什么区别:

p = (int*) malloc (5*sizeof(int));

int *ptr = new int[5];

是 C 的内存分配的顶级版本,用于指向在内存中为 5 个整数创建一个点的指针吗?那么底部是C++的版本呢?它们出现在内存中的什么位置(如果出现)。

【问题讨论】:

  • 取决于实现。 C++ 库的默认operator new 可能只是在后台调用malloc,也可能不会。它还可能分配额外的空间来跟踪数组大小,对用户程序是不可见的。
  • 对于ints,不是很多。但是尝试对非 POD 类型(过度简化,“具有构造函数的类型”)执行此操作,差异会很大,因为 malloc 不知道它应该首先调用构造函数。

标签: c++ c pointers malloc allocation


【解决方案1】:

两者都分配 size 字节的未初始化存储并返回指向它的指针。两个 sn-ps 都适用于 C++,但 new 是 C++ 独有的。两者的实现取决于编译器。使用malloc() 函数时,始终使用free() 函数来释放内存。使用new 运算符时,始终使用delete 运算符来释放内存。切勿混用。

new 可以提供一些其他功能,例如重载和调用非原始类型构造函数。 See.

在您给出的两个示例中,内存将按顺序分配。

【讨论】:

  • 都分配到堆上了吗?
  • 动态内存在堆上分配,而指针本身在栈上分配两种分配方式。
  • 并且在使用new[]的情况下,始终使用delete[],而不是delete。当然,通常你应该完全避免使用new[]/delete[]
  • 因此 C++ 运算符“new”和“delete”用于分配动态内存。而另一方面,在 C 语言中,函数 malloc 用于分配动态内存。我可以在 C++ 和 C 中使用 malloc,但对于 new/delete 则不是这样。
猜你喜欢
  • 2016-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多