У меня есть метод класса, который работает с копией объекта (* это, если быть точным). Утечки происходят в перегруженном операторе присваивания - это то, о чем говорит Visual Leak Detector. То, что я делаю, работает с копией, и если работа выполнена удовлетворительно, я копирую этот вновь созданный объект обратно. Я также реализовал собственный деструктор, конструктор копирования и оператор присваивания, потому что проблема возникает с динамически распределенной памятью, очевидно. Мой опыт работы с C++ довольно ограничен, поэтому в коде могут быть какие-то злые вещи.C++ - перегруженные операторы памяти оперативной памяти
При необходимости я предоставит дополнительную информацию.
Проблематичный метод:
bool Grid::SurroundShipSquares(int top, int bottom, int left, int right)
{
// copying itself
Grid gridCopy(*this);
Square** squaresCopy = gridCopy.GetSquares();
for (int i = top; i <= bottom; ++i)
{
for (int j = left; j <= right; ++j)
{
if (squaresCopy[i][j].GetState() != SquareState::Vacant)
return false;
(squaresCopy[i][j]).SetState(SquareState::Unoccupiable);
}
}
// the problem occurs here
*this = gridCopy;
return true;
}
Копировать конструктор:
Grid::Grid(const Grid& source)
{
_position = source._position;
_size = source._size;
int dimensions = static_cast<int>(_size);
_squares = new Square*[dimensions];
for (int i = 0; i < dimensions; ++i)
{
_squares[i] = new Square[dimensions];
for (int j = 0; j < dimensions; ++j)
{
_squares[i][j] = source._squares[i][j];
}
}
}
Назначение Оператор:
Grid& Grid::operator=(const Grid& source)
{
if (this == &source)
return *this;
_position = source._position;
_size = source._size;
int dimensions = static_cast<int>(_size);
_squares = new Square*[dimensions];
for (int i = 0; i < dimensions; ++i)
{
_squares[i] = new Square[dimensions];
for (int j = 0; j < dimensions; ++j)
{
_squares[i][j] = source._squares[i][j];
}
}
return *this;
}
деструктор:
Grid::~Grid()
{
int dimensions = static_cast<int>(_size);
for (int i = 0; i < dimensions; ++i)
{
delete[] _squares[i];
}
delete[] _squares;
}
Сохраните все проблемы и используйте вместо этого [copy-and-swap idiom] (http://stackoverflow.com/questions/3279543/what-is-the-copy-and-swap-idiom). –
Не делайте этого. – Puppy
К сожалению, этот вопрос стал еще одной демонстрацией того, почему мое участие в этой части сети SE в последнее время выпало. –