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++ 中,您几乎应该永远不会 使用 malloc
、calloc
或 free
。如果可能的话,也要避免 new
和 new[]
,而是使用对象实例或实例向量。
至于你的第二个问题(实际上与第一个问题无关),*(myBoxArray2).printer(23)
是 错误的 因为 .
选择运算符具有更高的 precedence 而不是取消引用运算符 *
。这意味着首先你在一个无效的指针上使用 .
成员选择器,并且你试图取消引用 printer
returns 这也是错误的,因为它没有return 随便什么。
你想要(*myBoxArray2).printer(23)
(注意星号的位置是在括号内),这完全是一样的作为 myBoxArray2->printer(23)
.
另请注意 myBoxArray2->printer(23)
与 myBoxArray2[0].printer(23)
相同。
#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++ 中,您几乎应该永远不会 使用 malloc
、calloc
或 free
。如果可能的话,也要避免 new
和 new[]
,而是使用对象实例或实例向量。
至于你的第二个问题(实际上与第一个问题无关),*(myBoxArray2).printer(23)
是 错误的 因为 .
选择运算符具有更高的 precedence 而不是取消引用运算符 *
。这意味着首先你在一个无效的指针上使用 .
成员选择器,并且你试图取消引用 printer
returns 这也是错误的,因为它没有return 随便什么。
你想要(*myBoxArray2).printer(23)
(注意星号的位置是在括号内),这完全是一样的作为 myBoxArray2->printer(23)
.
另请注意 myBoxArray2->printer(23)
与 myBoxArray2[0].printer(23)
相同。