Вызов деструктора ПОСЛЕ перегруженного вызова Оператор присваивания - C ++ - PullRequest
1 голос
/ 16 марта 2012

У меня есть указатель на граф с именем * graph1, и для него уже выделена память (примечание: не является частью вопроса, но Graph является шаблоном класса).Я также создал еще один экземпляр Graph под названием graph2.Я вызвал перегруженный оператор присваивания для них так:

Graph<std::string,std::string> *graph1 = new Graph<std::string,std::string>;
...
... // Called member functions on graph1
Graph<std::string,std::string> graph2;
graph2 = *graph1;

Оператор присваивания работает правильно, НО по какой-то причине деструктор Graph также вызывается сразу после вызова оператора присваивания.Это нормально, или я неправильно реализую оператор присваивания?

Вот как я реализовал оператор присваивания:

template <typename VertexType, typename EdgeType>
Graph<VertexType, EdgeType> Graph<VertexType, EdgeType>::operator=(const Graph<VertexType, EdgeType> &source)
{
  std::cout << "\tAssignment Operator called\n\n";
  if(this == &source)
    return *this;

  this->vecOfVertices = source.vecOfVertices;
  this->orderPtr = source.orderPtr;
  this->count = source.count;
  return *this;
}

1 Ответ

6 голосов
/ 16 марта 2012

Правильное определение оператора присваивания:

Graph<VertexType, EdgeType>& Graph<VertexType, EdgeType>::
    operator=(const Graph<VertexType, EdgeType> &source);

Используя Graph<VertexType, EdgeType> в качестве возвращаемого типа, вы создаете ненужное создание временной переменной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...