struct node
{
char *ptr = (char *)malloc(sizeof(char)); // INVALID
} *current;
Прежде всего, вы не должны смешивать модели памяти. Если вы используете new
, придерживайтесь new
. Не отскакивайте между new
и malloc
.
Во-вторых, это недопустимо C++. Вы не можете объявить члена класса и вызвать функцию для ее инициализации в объявлении (если вы не используете новые возможности C++ 11). Обновление его, чтобы очистить его вверх будет выглядеть примерно так:
struct node
{
char* ptr; // declare the pointer
node() : ptr(new char) { } // initialize the pointer in the constructor
// NOTE: should also add a copy constructor and copy-assignment operator here
~node()
{
delete ptr; // free the memory in the destructor
}
};
int main() // NOTE that main must return an int, not void
{
node current = new node();
node temp = *current; // will do a shallow copy
// ...
delete current;
// PROBLEM - temp now has a dangling pointer!
return 0;
}
отметить также, что нет никаких причин, почему ptr
должен быть указателем в этом случае. Так как вы только динамически выделять один char
, вы можете просто использовать автоматический:
struct node
{
char data;
node() : data('\0') { }
};
int main()
{
node current;
node temp = current; // temp now has a copy of data, no problems
return 0;
}
будет выше код автоматически устанавливается current-> PTR к точке, где TEMP-> PTR наведен
Код, который у вас есть, даже не будет скомпилирован, но если вы сделаете исправления, оператор присваивания по умолчанию будет выполнять мелкую копию. В случае с указателем это будет означать, что у вас есть два объекта, указывающих на одну и ту же ячейку памяти. Поскольку они оба предполагают, что они владеют им, когда один из них уничтожает его, другой остается с висящим указателем.
Это полностью недействительный код на C++. Прогоните его через компилятор со строгими предупреждениями и проверкой ошибок и обновите свой вопрос с помощью исправленного кода. –
Ваш код не будет делать ничего из этого, потому что он не будет компилироваться. – dasblinkenlight
Ой, извините, ошибся. отредактировано сейчас! –