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

运行`delete[] p;`时触发未知信号异常的原因及解决方法

解决delete[]时的Unknown signal异常问题

问题根源

你的代码触发异常的核心原因是:遍历数组时修改了new[]返回的原始指针p的指向。
在第一个for循环中:

for (int *q = p + n; p < q; p++){
    cout << *p << '\t';
}

循环过程中p不断自增,循环结束后p已经指向了数组的末尾(p + n的位置),不再是new int[n]返回的初始首地址。而delete[]要求必须传入new[]返回的原始指针,否则会触发未定义行为,表现为你看到的Unknown signal异常。

另外,后续遍历char* s时也修改了s的原始指向,虽然这不是触发当前异常的直接原因,但同样是不良编码习惯。

修复方案

使用临时指针进行遍历,保留原始指针的初始指向:

  • 遍历int数组时,用临时指针代替p进行自增操作
  • 遍历char数组时,同样用临时指针代替s进行自增操作

修复后的完整代码

#include <iostream>
using namespace std;

int main()
{
    int n = 4;
    int *p = new int[n];
    for (int i = 0; i < n; i++)
        p[i] = 2 * i +1;
    
    // 使用临时指针temp_p遍历,不修改原始p
    for (int *temp_p = p, *q = p + n; temp_p < q; temp_p++){
        cout << *temp_p << '\t';
    }
    cout << endl;
    
    char *s = (char *)p;
    char ch = 'A';
    int n2 = n * sizeof(int) / sizeof(char);
    for (int i = 0; i < n2; i++)
        s[i] = ch + i;
    
    // 使用临时指针temp_s遍历,不修改原始s
    for (char *temp_s = s, *r = s + n2; temp_s < r; temp_s++){
        cout << *temp_s;
    }
    cout << endl;
    
    delete[] p;
    return 0;
}

修复说明

  • 原始指针p和s始终保留new[]返回的初始地址,确保delete[] p能正确识别并释放分配的内存块
  • 临时指针仅负责遍历操作,不会影响原始指针的指向,避免了未定义行为的触发

内容的提问来源于stack exchange,提问作者大力发展生产力

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 21:12:13