C++ 中,new Type 和 new Type() 都用于动态分配内存,但它们的初始化行为不同,使用 new Type 时,如果是内置类型(如 int、double),不会自动初始化,变量值不确定;如果是自定义类类型,则会调用默认构造函数。使用 new Type() 时,不仅会分配内存,还会对内置类型进行初始化(如设为 0),类类型同样会调用默认构造函数。new Type() 更适合在需要确保变量有初始值的情况下使用。

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() 会对成员执行值初始化(即 x0)。

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

推荐文档