我有点担心此代码可能会发生内存泄漏。我想知道实际上是否存在泄漏,以及解决此问题的正确方法是什么。
说明:我有一个基类Pet
和派生类Cat
,Dog
和Bird
。我正在解析文件中的行,并且根据该行中的某些内容,我需要创建派生类的实例,然后以特定方式再次解析行的一部分。
这是一个示例文件:
Dog Spot Brown,Labrador,5
Cat Felix Black,7
Bird Polly Green,Parrot,12,Crackers
和一些代码:
class Pet
{
protected:
string _type;
string _name;
string _desc;
public:
Pet();
bool ParseLine(std::string line);
string Type() { return _type; }
string Name() { return _name; }
string Desc() { return _desc; }
};
class Dog : public Pet
{
private:
string _color;
string _type;
int _age;
public:
Dog(string type, string name, string desc);
bool ParseDesc(string desc);
};
主要代码:
ifstream infile(filename, ifstream::in);
string line;
while(getline(infile, line))
{
Pet* pet = new Pet(); // "new" called once
if(pet->ParseLine(line))
{
if(pet->Type() == "Dog")
{
pet = new Dog(pet->Type(), pet->Name(), pet->Desc()); // "new" called again
pet->ParseDesc(pet->Desc());
}
else if(pet->Type() == "Cat")
{
// ...
}
}
}
基本上会发生什么:
我从文件中提取一行,并将其解析为三个字段(这是
ParseLine()
的作用:Type (Dog, Cat, Bird, etc.)
Name (Spot, Felix, Polly, etc.)
Description ("Brown,Labrador,5", "Black,7", "Green,Parrot,12,Crackers", etc)
然后,将这三个字段分配给
Pet*
变量。然后,根据
Pet*->Type()
中的值,我解析Pet*->Desc()
以获得该特定类型动物的附加信息。我担心两次将运算符称为"new"。我认为可能有一种更好的方式来格式化代码,从而可以完全避免这种情况。
我真的很想保留我的
getline()
例程。我不想窥视行以确定类型,然后决定如何创建实例。另外,当我重新创建
_type, _name, and _desc
时,我必须重新分配变量Dog()
,而我不必这样做。谢谢。
-
具体来说,如何避免这种情况:
Pet* pet = new Pet();
pet->ParseLine(line);
string type = pet->Type();
string name = pet->Name();
string desc = pet->Desc();
delete pet;
if(type == "Dog")
{
Pet* dog = new Dog(type, name, desc);
dog->ParseDesc(desc);
}
最佳答案
是的,这会导致内存泄漏,因为您分配的new Pet()
永远不会删除,并且指向它的指针会被new Dog()
或其他东西覆盖。
我建议您创建一个所谓的工厂函数,该函数从文件中读取一行,并创建Pet
类型的行状态。
关于c++ - 这会导致内存泄漏吗/我应该如何构造代码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7094860/