在C++中,使用new
关键字进行动态内存分配时,可以根据需要初始化分配的内存。以下是您对new
操作符使用的几种情况的解释:
new int(10)
- 这行代码分配了一个
int
类型的单个内存空间,并将其初始化为10
。 - 等价于在栈上声明并初始化一个变量:
int x = 10;
,但这里的变量x
是在堆上分配的,需要使用指针来访问它。 - 示例:
int* ptr = new int(10); std::cout << *ptr << std::endl; // 输出:10 delete ptr; // 释放内存
- 这行代码分配了一个
new int()
- 这行代码分配了一个
int
类型的单个内存空间,但不对其进行显式初始化,其值将是未定义的(通常是随机值,取决于内存的状态)。 - 等价于在栈上声明一个未初始化的变量:
int x;
,但这里的变量x
是在堆上分配的。 - 示例:
int* ptr = new int(); std::cout << *ptr << std::endl; // 输出:未定义的值 delete ptr; // 释放内存
- 这行代码分配了一个
new int[10]
- 这行代码分配了一个包含10个
int
类型元素的数组,但不对这些元素进行显式初始化,它们的值将是未定义的。 - 等价于在栈上声明一个未初始化的数组:
int arr[10];
,但这里的数组arr
是在堆上分配的。 - 示例:
int* arr = new int[10]; // arr[0] 到 arr[9] 都是未定义的值 delete[] arr; // 释放内存
- 这行代码分配了一个包含10个
new int[10]()
- 这行代码分配了一个包含10个
int
类型元素的数组,并将所有元素初始化为0
(对于基本类型如int
,默认初始化就是将其值设为0)。 - 等价于在栈上声明并初始化一个数组:
int arr[10] = {0};
,但这里的数组arr
是在堆上分配的。 - 示例:
int* arr = new int[10](); for (int i = 0; i < 10; ++i) { std::cout << arr[i] << " "; // 输出:0 0 0 0 0 0 0 0 0 0 } std::cout << std::endl; delete[] arr; // 释放内存
- 这行代码分配了一个包含10个
注意事项:
- 使用
new
分配的内存必须使用delete
(对于单个对象)或delete[]
(对于数组)来释放,以避免内存泄漏。 - 初始化数组时,使用括号
()
表示使用默认构造函数或值初始化(对于基本类型,如int
,就是将其值设为0)。对于类类型的数组,这还会调用每个元素的默认构造函数。