运行`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,提问作者大力发展生产力
相关产品推荐
相关产品推荐

