У меня есть класс с некоторым основным конструктором. Код в основной
C1 g = *new C1(2);
delete &g;
приводит к ошибке:
double free or corruption
Разве этот код не эквивалентен
C1 *g = new C1(2);
delete g;
Что это за вещь, которую я не понимаю?
Предполагая, что это 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
) поэтому возвращает адрес памяти откуда-то в сегменте кучи, и все счастливы.