c++中new和malloc的区别

differences between new and malloc in c++

#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 打印。 还有为什么当我使用 -> 时功能打印机运行,但当我使用等效的 *(myBoxArray2).printer(23)

时却不运行

区别在于malloc分配内存时根本没有初始化。另一方面,new 调用适当的构造函数来初始化该内存(如果该构造函数用于初始化该内存)并执行其他操作以使 class 可用。

另外delete为您调用析构函数。

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

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

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


至于你的第二个问题(实际上与第一个问题无关),*(myBoxArray2).printer(23) 错误的 因为 . 选择运算符具有更高的 precedence 而不是取消引用运算符 *。这意味着首先你在一个无效的指针上使用 . 成员选择器,并且你试图取消引用 printer returns 这也是错误的,因为它没有return 随便什么。

你想要(*myBoxArray2).printer(23)(注意星号的位置是括号内),这完全是一样的作为 myBoxArray2->printer(23).

另请注意 myBoxArray2->printer(23)myBoxArray2[0].printer(23) 相同。