Я создал подкласс, B, для класса, который я буду называть А.Создание «нового» экземпляра решает проблему деструктора?
Я написал этот код для работы, поэтому я буду обобщать фактический код:
class A
{
public:
A()
{
important_variable = new Type();
...
};
~A (void) { delete(important_variable); }; // Default destructor
// more methods
protected:
Type *important_variable;
};
class B : public A
{
public:
B() : A() { important_variable = another_var; }
~B() {};
Type *another_var;
};
Наличие этого кода для B вызвало сбой моей программы с помощью «Необработанного исключения».
Теперь, когда я изменить код для класса B к этому:
class B : public A
{
public:
B() : A() { another_var = new Type(); important_variable = another_var; }
~B() {};
Type *another_var;
};
Исключение уходит.
Я думаю, что мой исходный код для B вызвал мою программу, потому что A пыталась удалить переменную, на которую все еще указала другая переменная. Правильно ли это рассуждение? Почему новый код для B заставляет мою программу работать?
Ваши рассуждения, вероятно, правильные (не могу сказать, не видя больше кода). Второй код работает, потому что вы создаете новый объект для каждого экземпляра, поэтому каждый раз, когда вы его удаляете, он не наступает на носки других. Но ваш код имеет утечки памяти. Вы не можете просто переназначить указатель, не делая что-то о объекте, на котором он указывал. – Dave