文章目录
new和delete的两种用法(new分配内存和new不分配内存)
1 目标
本文旨在深入探讨 C++ 中内存管理的关键部分:new 和 delete 的两种使用方式。在日常的 C++ 编程中,正确地分配和释放内存是保证程序性能和稳定性的重要因素之一。
2 示例代码
2.1 常规的 new/delete 使用方式(new分配了内存)
这是最常见和基础的内存分配和释放方法。我们将详细探讨如何使用 new 操作符来动态分配单个对象或数组,并通过相应的 delete 或 delete[] 操作符释放内存。这种方式适用于大多数场景,是编写 C++ 程序时不可或缺的一部分。
#include <iostream>
int main() {
// 使用 new[] 分配整数数组
int* arr = new int[5];
// 初始化数组元素
for (int i = 0; i < 5; ++i) {
arr[i] = i + 1;
}
// 输出数组元素
std::cout << "动态分配的整数数组元素为: ";
for (int i = 0; i < 5; ++i) {
std::cout << arr[i] << " ";
}
std::cout << std::endl;
// 使用 delete[] 释放数组内存
delete[] arr;
return 0;
}
2.2 定位 new/delete 的使用方式(new并没有分配了内存)
相比于常规方法,定位 new/delete 允许我们在特定的内存位置上分配和释放内存。我们将介绍如何通过重载的 operator new[] 和 operator delete[] 函数,以及带有额外参数的定位 new/delete,来实现更精确的内存管理。这种方式通常用于特定需求,如内存池的实现或需要特定内存布局的应用程序。
注意:这种方法的new并不分配内存!!!
#include <iostream>
class MyClass {
public:
int value;
MyClass(int v) : value(v) {
std::cout << "MyClass 构造函数被调用,value = " << value << std::endl;
}
~MyClass() {
std::cout << "MyClass 析构函数被调用,value = " << value << std::endl;
}
};
int main() {
// 静态分配内存
alignas(MyClass) char memory[sizeof(MyClass) * 3];
// 在已分配的内存上使用定位 new 构造对象数组
MyClass* objArray = new (memory) MyClass[3] {
MyClass(1),
MyClass(2),
MyClass(3)
};
// 输出构造的对象信息
for (int i = 0; i < 3; ++i) {
std::cout << "构造的对象 " << i + 1 << " 的 value 值为: " << objArray[i].value << std::endl;
}
// 使用带有两个参数的定位 delete[] 释放数组内存
operator delete[](objArray, memory);
return 0;
}