使用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
相关产品推荐
相关产品推荐

