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

vector存动态分配对象时,如何放置delete函数避免Segmentation Fault

问题分析与解决方案

先说明你删指针就触发段错误的原因:

  • 要是在while循环里执行delete ptr,你刚把对象指针塞进myVect,转头就把对应对象释放了,myVect里存的立刻变成野指针,之后只要程序访问这些指针就会崩溃。
  • 要是在循环外执行delete ptr,你只能释放最后一个创建的对象,前面的对象全留着内存泄漏,而且如果文件是空的,ptr根本没初始化就被delete,直接触发段错误。

正确的内存释放方式

既然作业要求myVect必须存指针,那释放内存的时机得等你完全用完myVect里的所有对象之后,比如在Sequencer类的析构函数里处理,或者写个专门的清理函数:

// 示例:在Sequencer的析构函数中添加内存清理逻辑
Sequencer::~Sequencer() {
    // 遍历vector,逐个释放每个对象
    for (MyObject* obj : myVect) {
        delete obj;
        obj = nullptr; // 可选操作,避免野指针残留
    }
    myVect.clear(); // 清空vector
}

顺带修正你代码里的其他隐患

  1. 读取名称的循环没有边界判断:如果某行里没有逗号,line[count]会越界访问,直接导致崩溃,得改成:
while(count < line.size() && line[count] != ',') {
    name += line[count];
    count++;
}
  1. 插入字符的循环i+=2的逻辑太死板:如果行末尾没有逗号,最后一个字符会被漏掉,也可能出现越界,建议改成更稳妥的写法:
for(int i = count + 1; i < line.size(); ) {
    (*ptr).InsertEnd(line[i]);
    // 跳过当前字符,若后面有逗号则一并跳过
    i++;
    if(i < line.size() && line[i] == ',') {
        i++;
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 00:30:13