Я немного обеспокоен тем, что этот код может иметь утечку памяти.Я хотел бы знать, если на самом деле есть утечка, а также как правильно решить эту проблему.
Описание: У меня есть базовый класс 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);
}