C++中new和delete如何构建简单对象和复杂对象?
在C++中,new 和 delete 操作符用于动态分配和释放内存。具体来说,它们可以用于构建简单对象(例如基本数据类型)和复杂对象(例如包含多个成员变量或自定义构造函数和析构函数的类对象)。
一、构建简单对象
1. 简单对象的分配和释放
对于简单对象,例如基本数据类型(int、double 等),new 和 delete 非常直接。
简单对象的分配:
int* p = new int; // 分配一个int类型的内存并返回指针
*p = 10; // 赋值
简单对象的释放:
delete p; // 释放之前分配的int类型内存
2. 数组的分配和释放
数组的分配:
int* arr = new int[10]; // 分配一个包含10个int类型元素的数组
数组的释放:
delete[] arr; // 释放之前分配的数组内存
二、构建复杂对象
1. 复杂对象的分配和释放
对于复杂对象,例如类对象,new 和 delete 会调用构造函数和析构函数。
复杂对象的分配:
class MyClass {
public:
MyClass() { /* 构造函数代码 */ }
~MyClass() { /* 析构函数代码 */ }
};
MyClass* obj = new MyClass; // 分配MyClass对象并调用构造函数
复杂对象的释放:
delete obj; // 调用析构函数并释放内存
2. 数组的分配和释放
复杂对象数组的分配:
MyClass* arr = new MyClass[10]; // 分配一个包含10个MyClass对象的数组
复杂对象数组的释放:
delete[] arr; // 调用析构函数并释放数组内存
三、完整示例
为了更好地说明,下面是一个完整的示例,展示了如何使用 new 和 delete 来构建和释放简单对象和复杂对象:
#include
class MyClass {
public:
MyClass() {
std::cout << "MyClass constructor called" << std::endl;
}
~MyClass() {
std::cout << "MyClass destructor called" << std::endl;
}
};
int main() {
// 分配和释放简单对象
int* p = new int;
*p = 10;
std::cout << "Value of p: " << *p << std::endl;
delete p;
// 分配和释放简单对象数组
int* arr = new int[5];
for (int i = 0; i < 5; ++i) {
arr[i] = i * 10;
std::cout << "Value of arr[" << i << "]: " << arr[i] << std::endl;
}
delete[] arr;
// 分配和释放复杂对象
MyClass* obj = new MyClass;
delete obj;
// 分配和释放复杂对象数组
MyClass* objArr = new MyClass[3];
delete[] objArr;
return 0;
}
运行该示例后,将看到构造函数和析构函数的调用,表明对象的构建和释放过程。
注意事项
- 内存泄漏:确保每个 new 都有相应的 delete。特别是在异常处理和多路径逻辑中要小心。
- 数组的释放:使用 delete[] 释放数组内存,否则行为未定义。
- 智能指针:为了自动管理内存释放,C++11 引入了智能指针(例如 std::unique_ptr 和 std::shared_ptr),推荐使用智能指针来避免手动管理内存。