2015-01-02 2 views
1

Конечно, следующий не должен быть выполнен, хотя он действителен для компилятора. Но что происходит, когда вы делаете?Использование нового оператора для статического выделения объекта

CClass clss = *new CClass(); 

В отличие от вышесказанного, следующий компилируется, но дает ошибку утверждения.

delete &clss; 

Связано ли это с распределением памяти как в стеке, так и в куче?

+3

экземпляр 'clss' становится копией инициализированного по значению, динамически выделенного экземпляра' CClass' и имеет автоматическое хранилище, которое не может быть освобождено с помощью 'delete' (* если этот класс не предоставляет класс-специфический' удаление' оператор) –

+0

@PiotrS. моя логика говорит мне, что такой оператор класса 'delete' должен быть сдержан для очистки членов, это правда? – brainoverflow

+0

его деструктор, который отвечает за правильную очистку элементов, на самом деле с удалением класса, вызванным в автоматическом экземпляре хранилища, он будет дважды вызван –

ответ

1

Первая строка кода правильна, то инициализировать статически выделяемый CClass экземпляра с другой экземпляр выделяется динамически.

Второй, очевидно, ошибочен, поскольку вы пытаетесь удалить объект, который не был динамически распределен.

В первой строке возникает утечка памяти, так как вы динамически выделяете кучу памяти, но не сохраняете ее адрес, поэтому ее нельзя удалить (удалить).

+0

Итак, когда вы делаете 'CClass * clssPtr = new CClass(); Класс CClass = * clssPtr; delete classPtr; 'будет действительным для оператора delete? – brainoverflow

+0

Вот и все, указатели используются для сохранения динамической памяти. –

+0

Примечание: формально говоря, не вызывая 'delete' на указателе, полученном' new', хуже, чем просто утечка памяти, это неопределенное поведение. Прагматически, помимо потенциальных странных оптимизаций, о которых я не знаю, это означает, что деструктор не запускается; если такой деструктор должен иметь побочные эффекты или ресурсы релиза (кроме памяти), то это означает проблемы ... –

2

Если разбить его:

new CClass() -> динамически выделяется экземпляр указатель

CClass clss -> статически выделяется переменная

CClass clss = *new CClass(); -> копирует значение указывает временный в CLSS

&clss -> адрес статически распределенной переменной

delete &clss; -> удалить статически выделенную переменную (не имеет смысла)

Смежные вопросы