new用于动态分配内存,delete用于释放;new可创建单个对象或数组并返回指针,需配对使用以防内存泄漏。

在C++中,new和delete是用于动态分配和释放内存的关键字。它们允许程序在运行时从堆(heap)上申请和归还内存空间,相比栈上的静态或自动变量更加灵活,尤其适用于对象生命周期不确定或数据大小在运行时才能确定的场景。
使用new可以动态创建单个对象或对象数组,返回指向该类型对象的指针。
● 动态创建单个对象:int* p = new int; // 分配一个int大小的内存
*p = 10; // 可以通过指针赋值
int* q = new int(25); // 分配并初始化为25
● 动态创建对象数组:
int* arr = new int[10]; // 分配可存储10个int的数组
for(int i = 0; i
arr[i] = i * 2;
}
● 类对象的动态创建:
立即学习“C++免费学习笔记(深入)”;
class MyClass {
public:
MyClass() { cout
~MyClass() { cout
};
MyClass* obj = new MyClass; // 调用构造函数
MyClass* objArray = new MyClass[5]; // 创建5个对象,每个都调用构造函数
使用delete释放由new分配的内存,防止内存泄漏。必须与new的使用方式匹配。
● 释放单个对象:delete p; // 释放单个int
delete q;
delete obj; // 释放单个类对象,会调用析构函数
● 释放对象数组:
delete[] arr; // 必须使用delete[]来释放数组
delete[] objArray; // 同样会依次调用每个元素的析构函数
注意:如果对数组使用了 delete 而不是 delete[],行为是未定义的,可能导致程序崩溃或资源未正确释放。
使用 new 和 delete 时容易犯以下错误:
● 忘记释放内存:导致内存泄漏,长时间运行的程序可能耗尽内存。
● 多次释放同一块内存:
delete ptr;
delete ptr; // 错误!重复释放,未定义行为
● 使用已释放的指针:
delete ptr;
*ptr = 100; // 危险!访问已释放内存
● 混淆 delete 和 delete[]:
new[] 配 delete[],new 配 delete,不可混用。
● 将 delete 用于非 new 的内存:
int x;
int* p = &x;
delete p; // 错误!x 是栈变量,不能 delete
虽然 new 和 delete 在底层控制上很有用,但现代C++更推荐使用智能指针和容器来管理内存,避免手动管理带来的风险。
● 使用 unique_ptr 管理独占资源:#include <memory>
auto p = std::make_unique<int>(42);
// 自动释放,无需手动 delete
● 使用 shared_ptr 实现共享所有权:
auto sp1 = std::make_shared<MyClass>();
auto sp2 = sp1; // 引用计数+1,离开作用域自动清理
● 使用 vector 替代动态数组:
std::vector<int> vec(10); // 比 new int[10] 更安全、易用
基本上就这些。new 和 delete 是C++动态内存管理的基础,但应谨慎使用,优先考虑RAII和智能指针机制,让代码更安全、简洁。
以上就是c++++中new和delete的用法_C++动态内存分配与释放的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号