c ++中new和malloc之间的差异

时间:2017-04-07 07:51:05

标签: c++ malloc dynamic-allocation

#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;
}

问题只是因为当我使用新的&#39;打印出构造函数,但是当我简单地将指针解析为myBoxArray2时,不会打印构造函数,也不打印函数printer。 另外,为什么当我使用->功能打印机运行时,而不是当我使用等效的*(myBoxArray2).printer(23)

2 个答案:

答案 0 :(得分:2)

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

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

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

您想要myBoxArray2->printer(23)(请注意星号的位置 括号内),与<{1}}完全相同。< / p>

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

答案 1 :(得分:1)

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

同样delete会为你调用析构函数。

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