2016-04-05 4 views
2

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

Приведенный ниже код печатает 4 раза «конструктор»! но только однажды «Деструктор позвонил!» означает ли это, что память для всего массива была освобождена?

class Box 
{ 
    public: 
     Box() { 
     cout << "Constructor called!" <<endl; 
     } 
     ~Box() { 
     cout << "Destructor called!" <<endl; 
     } 
}; 

int main() 
{ 
    Box myBoxArray[4]; 

    delete myBoxArray; // Delete array 

    return 0; 
} 

Однако, если я объявить myBoxArray динамически, как показано в коде ниже, вызывается деструктор в 4 раза.

class Box 
{ 
    public: 
     Box() { 
     cout << "Constructor called!" <<endl; 
     } 
     ~Box() { 
     cout << "Destructor called!" <<endl; 
     } 
}; 

int main() 
{ 
    Box* myBoxArray = new Box[4]; 

    delete [] myBoxArray; // Delete array 

    return 0; 
} 

Есть точка deallocating без динамически распределяемой памяти или лучше оставить его сборщиком мусора?

+5

Ваш первый пример спортивного неопределенного поведения. Вы не можете вызывать 'delete' на том, что раньше не было' new'. – SergeyA

+5

Нет сборщика мусора в C++ – Kamil

ответ

8

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

delete [] myBoxArray; // Delete array 

имеет неопределенное поведение (UB), где ничего или ничего не может произойти.

Вы можете только delete что-то, что вы сделали new, и можете только delete[] что-то, что вы сделали new[]. Любые нарушения этого правила сделают программу неправильной.

+2

Вы избили меня на 2 секунды :). – Rob

+0

Есть ли способ удалить из памяти arays/variables, которые не сделаны с '' new''? –

+0

@AkkaJaworek: они автоматически удаляются, когда выполнение завершает блок, в котором они объявлены. –