You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

释放指针后能否给其赋值?我的动态数组扩容代码是否合法?

问题解答

核心结论

你提供的扩容代码存在致命的未定义行为,不可正常运行。

逐个问题解答

1. 已经被释放的指针能否被其他指针赋值?

要先区分两个概念:指针变量本身和指针指向的内存空间:

  • 若某块堆内存已经被delete释放,所有指向这块内存的指针都会变为野指针。你可以给野指针变量本身重新赋值新的合法内存地址,这个操作是合法的。
  • 但你不能把野指针存储的地址(也就是已经被释放的内存地址)赋值给其他指针,否则另一个指针也会变成野指针,后续访问对应内存会触发未定义行为。

2. 上述代码是否合法有效?

这段代码完全不合法,存在致命逻辑错误:
当你执行list = temp;之后,list和temp两个指针指向的是同一块刚申请的新内存空间,你紧接着执行delete[] temp;会直接释放这块新内存,此时list就变成了野指针,后续任何对list元素的读写操作都会触发不可预料的问题,包括程序崩溃、数据乱码、内存污染等。

3. 执行delete [] temp操作会不会对list造成负面影响?

会产生致命影响。此时list和temp指向同一块内存,delete[] temp会直接释放这块内存,list会变成野指针,完全无法正常使用。

修复方案

仅需删除代码最后一行的delete[] temp;即可。temp只是用来暂存新内存地址的临时指针,赋值给list之后,新内存的管理权就转移给了list,不需要额外释放temp指向的内存,等到整个动态数组不再使用时,再统一调用delete[] list释放即可。

修复后的正确代码:

if (currLength + 1 > maxLength)
{
    E *temp = new E[2 * maxLength]; // Doubling the chunk size
    for (int i = 0; i < maxLength; i++)
    {
        temp[i] = list[i];
    }
    maxLength *= 2; // the max size doubles
    delete[] list; // 释放旧的数组内存
    list = temp; // 把新内存的管理权转移给list
}

内容的提问来源于stack exchange,提问作者Apurbo Banik Turjo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 14:54:05