двойное освобождение или повреждение при удалении ссылки

У меня есть класс с некоторым основным конструктором. Код в основной

 C1 g = *new C1(2);
delete &g;

приводит к ошибке:

double free or corruption

Разве этот код не эквивалентен

C1 *g = new C1(2);
delete g;

Что это за вещь, которую я не понимаю?

0

Решение

Предполагая, что это C ++, ваш первый фрагмент эквивалентен

C1 *p = new C1(2);
C1 g = *p;
delete &g;

p является указателем и лежит в стеке.
Местонахождение p указывает на ложь в куче.
g это C1 и лежит в стеке.
&g (значение передается delete) поэтому возвращает адрес памяти где-то в сегменте стека.

Вот если я не ошибаюсь
Переменные в стеке распределяются и освобождаются автоматически, поэтому, пока ваш delete &g сам по себе не вызывает ошибку, это автоматическое освобождение в конце функции, которая вызывает его.
Также, g это копия значения, на которое указывает pи не ссылка к этому или что-то.
плюс p не освобождается вообще.

Теперь в вашем втором фрагменте:

C1 *g = new C1(2);
delete g;

g является указателем и лежит в стеке.
Место, на которое указывает g лежит в куче.
g (значение передается delete) поэтому возвращает адрес памяти откуда-то в сегменте кучи, и все счастливы.

1

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector