C++中的new和delete

本文详细解释了C++中new和delete操作符的工作原理,包括它们如何分配和释放内存,并通过一个具体的示例展示了底层调用过程。同时,文中提到了如何手动实现这些操作以及与C语言malloc和free函数的关系。

 事实上

Class *pointer=new Class() 相当于

Class *pointer=(Class *)::operator new(sizeof(Class));

new (pointer) CLASS();//其实就是C的malloc

 

delete pointer相当于

pointer->~Class();

::operator delete(pointer);//其实就是C的free

 

例子

 

至于怎么判断有没有析构函数,正在学习中。

学STL源代码才发现,原来C++语法这么BT。

### C++中 `new` `delete` 的操作及正确使用方法 #### 1. 动态内存分配与释放 `new` `delete` 是C++中用于动态内存管理的操作符。`new` 用于分配内存并初始化对象,而 `delete` 用于释放由 `new` 分配的内存[^2]。 ```cpp #include <iostream> int main() { int* ptr = new int; // 使用 new 分配一个整数对象 *ptr = 10; std::cout << "Value: " << *ptr << std::endl; delete ptr; // 使用 delete 释放内存 return 0; } ``` #### 2. 分配基本数据类型 当需要为基本数据类型分配内存时,可以直接使用 `new` 操作符,并通过括号指定初始值[^1]。 ```cpp int* a = new int(10); // 分配一个整数并初始化为10 double* b = new double(3.14); // 分配一个双精度浮点数并初始化为3.14 ``` #### 3. 分配自定义类的对象 对于自定义类,`new` 不仅分配内存,还会调用类的构造函数进行初始化。同样,`delete` 在释放内存之前会调用析构函数[^2]。 ```cpp class MyClass { public: MyClass() { std::cout << "Constructor called" << std::endl; } ~MyClass() { std::cout << "Destructor called" << std::endl; } }; int main() { MyClass* obj = new MyClass(); // 调用构造函数 delete obj; // 调用析构函数并释放内存 return 0; } ``` #### 4. 分配数组 `new` 还可以用于分配数组,此时需要使用方括号指定数组大小。释放数组时,必须使用 `delete[]`,以确保所有元素的析构函数都被调用。 ```cpp int* arr = new int[5]; // 分配一个包含5个整数的数组 for (int i = 0; i < 5; ++i) { arr[i] = i; } delete[] arr; // 使用 delete[] 释放数组 ``` #### 5. 定位 `new`(Placement New) 定位 `new` 允许在特定的内存地址上构造对象,而不分配新的内存空间。使用时需要手动调用对象的析构函数来清理资源[^5]。 ```cpp #include <iostream> #include <new> // 包含 placement new int main() { char buffer[sizeof(int)]; // 提供内存空间 int* p = new (buffer) int(42); // 在 buffer 中构造整数 std::cout << *p << std::endl; p->~int(); // 手动调用析构函数 return 0; } ``` #### 6. 常见问题与注意事项 - **双重释放**:避免对同一指针多次调用 `delete`,否则会导致未定义行为[^4]。 - **内存泄漏**:确保每个 `new` 都有一个对应的 `delete`,否则可能导致内存泄漏。 - **异常安全**:在复杂的程序中,建议使用智能指针(如 `std::unique_ptr` 或 `std::shared_ptr`)管理动态内存,以提高代码的安全性可维护性。 ```cpp #include <memory> int main() { std::unique_ptr<int> ptr(new int(10)); // 使用 unique_ptr 管理内存 std::cout << *ptr << std::endl; return 0; // 内存自动释放 } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值