不确定在没有分段错误的情况下将我的删除功能放在哪里?

问题描述 投票:0回答:1

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

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

我的代码应该抓取每个对象并将其添加到 myVect

vector<MyObject*> myVect;

我的问题是我用new来分配。当然我知道这意味着我需要删除(当我没有删除时会有内存泄漏所以我不认为这是一个双重删除问题),但无论我在哪里删除 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();
}
c++ memory-management dynamic-programming new-operator delete-operator
1个回答
0
投票

记住,你不是

delete
指针,你是
delete
指针指向的东西。这意味着
delete ptr
ReadFile
中的任何地方都没有意义,因为只要
myVect
持有指向它们的指针,您就希望指向的对象继续存在。

取而代之的是,只要您完成了

delete
中的指针所指向的每个对象。最常见的地方是在
myVect
所属的对象的析构函数中。例如:
myVect

当然,如果您只是使用智能指针而不是原始指针,那么您就不需要手动
Sequencer::~Sequencer() { for (MyObject* p : myVect) { delete p; } }

任何东西。例如,

delete
可以是
myVect
。在那种情况下,
std::vector<std::unique_ptr<MyOjbect>>
s 会自动
unique_ptr
他们在生命周期结束时指向的对象。
在那种情况下,您可以将 

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

© www.soinside.com 2019 - 2024. All rights reserved.