1、内置类型(如 int, double, char)
如想要更安全的行为(初始化为0
),使用 new Type()
。如需要性能优化、并打算手动初始化值,可以使用 new Type
。
#include <iostream>
using namespace std;
int main() {
int* a = new int; // 未初始化,值是垃圾
int* b = new int(); // 初始化为0
std::cout << "*a = " << *a << " (未定义行为)\n";
std::cout << "*b = " << *b << " (值为0)\n";
delete a;
delete b;
return 0;
}
2、自定义类型(类或结构体)
对于有构造函数的类或结构体,两者的行为是一样的,都会调用构造函数。
#include <iostream>
using namespace std;
struct MyStruct {
int x;
MyStruct() {
x = 42;
std::cout << "Constructor called, x = " << x << std::endl;
}
};
int main() {
// 使用 new MyStruct 分配对象,调用默认构造函数
MyStruct* obj1 = new MyStruct; // 调用构造函数
std::cout << "obj1->x = " << obj1->x << std::endl;
// 使用 new MyStruct() 分配对象,也调用默认构造函数
MyStruct* obj2 = new MyStruct(); // 同样调用构造函数
std::cout << "obj2->x = " << obj2->x << std::endl;
// 释放内存
delete obj1;
delete obj2;
return 0;
}
3、无构造函数的结构体或 POD 类型
当结构体或类是 Plain Old Data(POD)类型时,new Plain
不会初始化成员,new Plain()
会对成员执行值初始化(即 x
为 0
)。
#include <iostream>
using namespace std;
struct Plain {
int x;
};
int main() {
// new Plain:不会对成员变量进行初始化
Plain* p1 = new Plain;
// new Plain():会将成员变量值初始化为 0
Plain* p2 = new Plain();
std::cout << "p1->x (未初始化,值不确定/垃圾值): " << p1->x << std::endl;
std::cout << "p2->x (初始化为 0): " << p2->x << std::endl;
// 释放内存
delete p1;
delete p2;
return 0;
}
4、数组
C++ 中,new Type
与 new Type()
表示的是动态分配对象的两种不同写法,它们在数组上下文中也有不同的行为。
#include <iostream>
using namespace std;
int main() {
// 分配未初始化的数组
int* arr1 = new int[5]; // 每个元素未初始化,可能是任意值(垃圾值)
// 分配并初始化为 0 的数组
int* arr2 = new int[5](); // 每个元素初始化为 0
std::cout << "arr1 contents (未初始化): ";
for (int i = 0; i < 5; ++i) {
std::cout << arr1[i] << " "; // 输出的是未定义值(可能是随机的)
}
std::cout << std::endl;
std::cout << "arr2 contents (初始化为0): ";
for (int i = 0; i < 5; ++i) {
std::cout << arr2[i] << " "; // 应全为 0
}
std::cout << std::endl;
// 释放内存
delete[] arr1;
delete[] arr2;
return 0;
}