我有一个 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();
}
记住,你不是
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