我有一个对象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();
}
1条答案
按热度按时间4ngedf3f1#
记住,你不需要
delete
指针,你需要delete
指针指向的对象。这意味着在ReadFile
中的任何地方delete ptr
都没有意义,因为你希望被指向的对象继续存在,只要myVect
持有指向它们的指针。相反,当你完成
myVect
中的指针指向的每个对象时,你需要delete
。最常见的地方是myVect
是其成员的对象的析构函数。例如:当然,如果你只是使用智能指针而不是原始指针,那么你就不需要手动
delete
任何东西。例如,myVect
可以是一个std::vector<std::unique_ptr<MyOjbect>>
。在这种情况下,unique_ptr
s将在其生命周期结束时自动delete
它们指向的对象。在这种情况下,您可以将
ReadFile
更改为如下内容:这都是假设你需要指针。你当前的
ReadFile
实现没有任何特殊的理由来动态分配对象。如果可能的话,最好的解决方案是让myVect
成为std::vector<MyObject>
,让std::vector
自己处理所有对象的生存期: