c++ 不知道在哪里把我的删除功能没有得到一个分段故障?

wtlkbnrh  于 2023-04-08  发布在  其他
关注(0)|答案(1)|浏览(112)

我有一个对象MyObject,它的成员变量包含一个名称(这是重载构造函数设置的)和一个字符数据的链表。我从一个文件中读取,该文件包含一堆MyObject,格式如下:

name,a,b,c,d
name1,a,b,c,d,e
// etc.

我的代码应该获取每个对象并将其添加到myVect vector<MyObject*> myVect;
我的问题是我使用new来分配。当然我知道这意味着我需要delete(当我没有delete时会有内存泄漏,所以我不认为这是双重删除问题),但无论我在哪里删除ptr,它都会导致分段错误。
我希望myVect不包含指针,但它必须(赋值)。
这是密码

void Sequencer::ReadFile() {
  ifstream fin;
  fin.open(fileName);
  cout << "Opened File" << endl;
  string line = "";
  MyObject* ptr;
  while(getline(fin, line)) {
    string name = "";
    int count = 0;
    while(line[count] != ',') {
      name += line[count];
      count++;
    }
    ptr = new MyObject(name);
    for(int i = count + 1; i < line.size(); i+=2) {
      (*ptr).InsertEnd(line[i]);
    }
    myVect.push_back(ptr);
    //delete ptr;                                                               
    //ptr = nullptr;                                                            
  }
  //delete ptr;                                                                 
  //ptr = nullptr;                                                              
  fin.close();
}
4ngedf3f

4ngedf3f1#

记住,你不需要delete指针,你需要delete指针指向的对象。这意味着在ReadFile中的任何地方delete ptr都没有意义,因为你希望被指向的对象继续存在,只要myVect持有指向它们的指针。
相反,当你完成myVect中的指针指向的每个对象时,你需要delete。最常见的地方是myVect是其成员的对象的析构函数。例如:

Sequencer::~Sequencer() {
    for (MyObject* p : myVect) {
        delete p;
    }
}

当然,如果你只是使用智能指针而不是原始指针,那么你就不需要手动delete任何东西。例如,myVect可以是一个std::vector<std::unique_ptr<MyOjbect>>。在这种情况下,unique_ptr s将在其生命周期结束时自动delete它们指向的对象。
在这种情况下,您可以将ReadFile更改为如下内容:

void Sequencer::ReadFile() {
  std::ifstream fin(fileName);
  std::string line = "";
  while(std::getline(fin, line)) {
    std::string name = "";
    int count = 0;
    while(line[count] != ',') {
      name += line[count];
      count++;
    }
    std::unique_ptr<MyObject> ptr = std::make_unique<MyObject>(name);
    for(int i = count + 1; i < line.size(); i+=2) {
      ptr->InsertEnd(line[i]);
    }
    myVect.push_back(ptr);
  }
}

这都是假设你需要指针。你当前的ReadFile实现没有任何特殊的理由来动态分配对象。如果可能的话,最好的解决方案是让myVect成为std::vector<MyObject>,让std::vector自己处理所有对象的生存期:

void Sequencer::ReadFile() {
  std::ifstream fin(fileName);
  std::string line = "";
  while(std::getline(fin, line)) {
    std::string name = "";
    int count = 0;
    while(line[count] != ',') {
      name += line[count];
      count++;
    }
    MyObject obj(name);
    for(int i = count + 1; i < line.size(); i+=2) {
      obj.InsertEnd(line[i]);
    }
    myVect.push_back(obj);
  }
}

相关问题