C ++ оператор перегрузки и деструкторы - PullRequest
1 голос
/ 26 марта 2012
struct Node
{
int value
Node* next;
}
typedef List Node*

const Set operator +(const Set& a, const Set& b)
{
    Set aSet;
    List newList = mergeListsCopy(a.list, b.list);
    aSet.list = newList;
    return aSet;
}

class Set
{
public:
//method decs
private:
    List list;
};

Set::~Set()
{
    list = deleteList(list);    
}

Внутренние элементы этого кода работают отлично, mergeListsCopy создает новый список из двух односвязных списков и назначает указатель на список, который является частной переменной aSet.

Проблема в том, что когда возвращается aSet, aSet.list - это какой-то странный ядовитый адрес (в данном случае 0xf).

Когда я запустил его через отладчик, набор был создан в рамках перегрузки оператора, но две ссылки на этот набор также были созданы локально с использованием символа aSet, перед тем как произошел возврат, программа перешла кдеструктор, предположительно для постороннего Сета, но так как есть только один Набор, он уничтожается.

Когда я комментирую моего деструктора, эта проблема исчезает.Что я сделал не так?

1 Ответ

3 голосов
/ 26 марта 2012

Вам необходимо следовать правилу Три .

Если вам нужно явно объявить либо деструктор , конструктор копирования , либо оператор копирования присваивания самостоятельно, вам, вероятно, нужно явнообъявите все три из них.

Скорее всего, временные безымянные объекты создаются (путем вызова неявного конструктора, созданного компилятором) в ходе выполнения вашей программы и когда эти временные объекты уничтожаютсяпри вызове деструктора это приводит к путанице в вашем связанном списке.

...