C ++ необработанные указатели и «удалить» - PullRequest
0 голосов
/ 09 января 2020

У меня есть вопрос, касающийся фрагмента кода ниже:

double d = 20.1;
double* pd = new double;
...
pd = &d;
delete pd;

В последней строке выдается ошибка в Visual C ++ 2015. Означает ли это, что указатель "pd" указывает на адрес стека "d "и его первоначальный указанный адрес в куче (правая часть знака равенства во второй строке) просочился?

Ответы [ 3 ]

4 голосов
/ 09 января 2020

Да, вы утекли двойной указатель первоначально на pd, но это не то, что вызывает ошибку.

Ошибка является результатом того, что вы пытаетесь delete адрес, выделенный стеком. Это строго неопределенное поведение. delete будет работать только для указателей, которые были созданы с new.

1 голос
/ 09 января 2020

Переменные содержат значения. Значения указателя - это просто значения. Не имена. Не переменные.

Когда вы манипулируете значением указателя, например, чтобы передать его в delete, вы заботитесь только о значении.

Это, по сути, эквивалентно:

int one=1;
one=2;
std::cout << one; // you won't be surprised to see 2, will you?

Значение в настоящее время в переменной имеет значение; не какое-то предыдущее значение. Не имя.

Ваша программа пытается освободить (delete) объект, который был выделен не вами (пользователем), а компилятором.

0 голосов
/ 10 января 2020

Означает ли это, что указатель "pd" указывает на адрес стека "d" и его исходный указатель на адрес в куче (правая часть знака равенства во втором линия) просочилась?

Да, это точно что это значит.

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