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

使用delete删除动态分配的pair数组触发Segmentation fault问题排查

问题分析:动态pair数组的内存释放错误

你猜的没错,段错误确实出在delete这一步!问题很简单:当你用new[]分配数组类型的内存时,必须用delete[]来释放,而不是普通的delete。

为什么会出错?

new[]在分配内存时,会在数组的额外空间里存储一些元信息(比如数组的元素个数),用来后续正确调用每个元素的析构函数(这里你的pair里包含string,它需要执行析构逻辑来释放内部内存)。而普通的delete完全不知道这是一个数组,它会把这块内存当成单个对象来处理,直接释放内存却跳过了数组元素的析构,甚至会错误地计算释放的内存大小,最终导致内存损坏,触发段错误。

修正后的代码

只需要把释放内存的语句改成delete[] array;就可以了:

#include <utility>
#include <iostream>
#include <string>
using namespace std;
int main() {
 cout << "Hey #1" << endl;
 pair<string, int> *array;
 array = new pair<string, int>[4];
 cout << "Hey #2" << endl;
 delete[] array; // 这里改成delete[]
 cout << "Hey #3" << endl;
}

额外建议(更安全的写法)

在C++里,手动管理动态数组其实是不推荐的,标准库提供的vector容器可以帮你自动处理内存分配和释放,完全避免这类错误。比如上面的代码可以改成:

#include <vector>
#include <utility>
#include <iostream>
#include <string>
using namespace std;
int main() {
 cout << "Hey #1" << endl;
 vector<pair<string, int>> array(4); // 直接用vector创建大小为4的数组
 cout << "Hey #2" << endl;
 // 不需要手动delete,vector会在作用域结束时自动释放内存
 cout << "Hey #3" << endl;
}

这样既简洁又安全,不用再担心内存释放的问题啦。

内容的提问来源于stack exchange,提问作者Da Mike

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 23:14:09