使用delete删除指针

原文:http://blog.sina.com.cn/s/blog_6405313801013jvg.html

用delete命令处理某个指针,说是把那个指针删除了是不正确的。

delete命令指示释放了那个指针原本所指的那部分内存而已。被delete后的指针p的值(地址值)并非就是NULL,而是随机值。

也就是被delete后,如果不再加上一句p=NULL,p就成了“野指针”,在内存里乱指一通。

如果在定义p的那个函数在delete了p后,没再调用p,就没什么问题,在这个函数结束后,p就会跟其它变量一样被消除。但若在那个函数里delete了p后,又没再给p赋值(地址值),再次调用p就危险了,因为这时p在内存里乱指,有可能指到一些重要地址,随时可能系统崩溃。

### 如何使用 `delete` 删除二级指针 在 C++ 中,当涉及到动态分配的二级指针时,释放其占用的内存是一个重要且常见的操作。以下是关于如何正确使用 `delete` 来释放二级指针所管理的内存的具体说明。 #### 动态分配与释放过程 假设有一个二级指针 `int** p` 被用来表示一个二维数组,则需要按照以下方式处理: 1. 首先,为每一行单独分配空间。 2. 接着,逐行为每列分配空间。 3. 使用完毕后,需按相反顺序逐一释放这些空间。 具体代码如下所示[^3]: ```cpp #include <iostream> using namespace std; int main() { int **p; int i, j; // 开始分配4行8列的二维数据 p = new int *[4]; for (i = 0; i < 4; i++) { p[i] = new int[8]; } // 初始化数据 for (i = 0; i < 4; i++) { for (j = 0; j < 8; j++) { p[i][j] = j * i; } } // 打印数据 for (i = 0; i < 4; i++) { for (j = 0; j < 8; j++) { if (j == 0) cout << endl; cout << p[i][j] << "\t"; } } // 开始释放申请的堆 for (i = 0; i < 4; i++) { delete[] p[i]; // 对于每一个一维数组进行释放 } delete[] p; // 最终释放指向各一维数组首地址的一级指针数组 } ``` 在此过程中需要注意的是,在调用 `delete[]` 前必须确保该指针确实指向由 `new[]` 分配的内存区域;否则可能导致未定义的行为。 另外还有一种情况是直接利用单次分配完成整个二维数组创建的情况,这种情况下只需两次调用即可完全清理掉所有资源[^2]: ```cpp void release(int** ptr) { delete[] (*ptr); delete ptr; } int main(){ int rows = 3, cols = 4; int** arrayPtr = new int*[rows]; *(arrayPtr) = new int[rows * cols]; // ... some operations ... release(arrayPtr); return 0; } ``` 以上两种方法都可以有效地管理和释放二级指针关联起来的大块连续或非连续存储区段上的对象实例们。但是无论采用哪种策略都务必遵循先进后出原则来进行相应的销毁动作以免造成悬垂指针等问题发生。 #### 注意事项 - 如果只简单地执行 `delete p;` 或者错误地尝试对某一部分重复删除,则可能会引发严重的程序崩溃或其他异常状况。 - 正确的做法应当始终是从最底层开始逐步向上层推进直至所有的子节点都被妥善处置为止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值