Вы не предоставили достаточно информации для решения проблемы. Нет ничего плохого в том, что вы написали код.
Я предполагаю, что Gridcell
не хватает надлежащего конструктора копирования, поэтому, когда gc
выходит из области видимости, он удаляет вещи, на которые *g
все еще ссылается.
Эта строка кода:
Gridcell gc = *g;
- это то место, где вызывается конструктор копирования. По сути это эквивалентно тому, чтобы сказать это:
Gridcell gc(*g);
, который вызывает конструктор Gridcell::Gridcell(const Gridcell &)
, иначе известный как конструктор копирования. Конструктор копирования отличается тем, что если у вас его нет, компилятор автоматически сгенерирует его для вас. Автоматически сгенерированный тип обычно просто вызывает конструктор копирования каждой отдельной переменной-члена, включая указатели. Для базовых типов, таких как int
или Foo *
, конструктор копирования просто создает точную копию.
Например, если у вас есть такой код:
class Foo {
public:
Foo() : msg_(new char[30]) { strcpy(msg_, "I'm Foo!"); }
~Foo() { delete [] msg_; }
private:
char *msg_;
};
void aFunction(Foo *aFoo)
{
Foo myfoo = *aFoo;
}
void anotherFunction()
{
Foo localfoo;
aFunction(&localfoo);
}
Это потерпит крах. localfoo
выделит символьный массив. Строка Foo myfoo = *aFoo
вызовет конструктор копирования, который сделает прямую копию указателя. Затем будет вызван деструктор для myfoo
и память будет освобождена. Затем будет вызван деструктор для localfoo
и память снова будет освобождена, что приведет к сбою во многих системах.