c ++中new和malloc之间的区别[重复]

Posted

技术标签:

【中文标题】c ++中new和malloc之间的区别[重复]【英文标题】:differences between new and malloc in c++ [duplicate] 【发布时间】:2017-09-02 12:19:25 【问题描述】:
#include <iostream>
#include <cstdlib>
using namespace std;

class Box 
   public:
      Box() 
         cout << "Constructor called!" <<endl;
      
      void printer(int x)
    
        cout<<x<<" printer"<<endl;
    

      ~Box() 
         cout << "Destructor called!" <<endl;
      

;

int main( ) 
    Box* myBoxArray = new Box[4];

    Box* myBoxArray2 = (Box*)malloc(sizeof(Box[4]));
    myBoxArray2->printer(23);
    *myBoxArray2;
    *(myBoxArray2).printer(23);

   return 0;

问题很简单,当我使用“new”时,构造函数被打印出来,但是当我简单地取消引用指向myBoxArray2 的指针时,构造函数没有被打印出来,printer 的函数也没有被打印出来。 还有为什么当我使用-&gt; 时功能打印机运行,但当我使用等效的*(myBoxArray2).printer(23) 时却没有运行

【问题讨论】:

您对malloc()的使用在这里无效。类实例必须在堆栈上或通过new 分配。当您使用 malloc() 时,不会调用任何 C++ 机器。 myBoxArray2 只是一个指向一些内存空间的指针,它的大小是——好吧,是无关紧要的东西的大小。即使您将myBoxArray 复制到该空间中,它也永远不会调用构造函数,因为 - 等待它 - 它没有被构造。 【参考方案1】:

malloc只分配内存,它不会调用可以使对象处于不确定状态的构造函数。

在 C++ 中,您几乎应该从不使用malloccallocfree。如果可能的话,也避免使用newnew[],而是使用对象实例或实例向量。


至于您的第二个问题(与第一个问题实际上无关),*(myBoxArray2).printer(23)错误,因为. 选择运算符的precedence 比取消引用运算符* 更高.这意味着首先您在无效的指针上使用 . 成员选择器,并且您尝试取消引用 printer 返回的内容,这也是错误的,因为它不返回任何内容。

你想要(*myBoxArray2).printer(23)(注意星号的位置在括号内),它与myBoxArray2-&gt;printer(23)完全相同

还要注意myBoxArray2-&gt;printer(23)myBoxArray2[0].printer(23) 相同。

【讨论】:

【参考方案2】:

不同之处在于 malloc 分配内存时根本不对其进行初始化。另一方面,new 调用适当的构造函数来初始化该内存(如果该构造函数用于初始化该内存)并执行其他操作以使类可用。

还有delete 为你调用析构函数。

经验法则是:切勿将malloc 与 C++ 一起使用,除非您知道自己在做什么。

【讨论】:

除非你真的知道自己在做什么(以及为什么这样做)——因此构造函数是 new。 即使您知道自己在做什么,您仍然应该可能不要这样做。编译器可能会假设这些对象是如何初始化的,因为优化和违反这是“未定义行为”的快速票。

以上是关于c ++中new和malloc之间的区别[重复]的主要内容,如果未能解决你的问题,请参考以下文章

C++—new/delete/malloc/free详解

JSP转发和重定向之间的区别[重复]

C中main(void)和main()之间的区别[重复]

C ++中new和new []之间有什么区别?

C中char []和char *之间的区别[重复]

C++中new出得对象与C中的malloc出得有啥联系和区别?