Корректная работа с памятью С++

Рейтинг: -1Ответов: 1Опубликовано: 03.06.2011

Вопрос (A):

void Fun(void){  
    int *a = new int[10];  
    int *b = new int[10];  
    CopyMemory(b, a, 10);  
}  

Если в дальнейшем мы не используем массив a[]:

  1. Мы должны освободить память: delete[] a?
  2. А если вместо 1 напишем a = NULL?
  3. И если не выполним ни 1, ни 2 а просто выйдем из функции Fun?

Вопрос (B):

void Fun(int **c){  
    int *a = new int[10];  
    int *b = new int[100];  
    CopyMemory(b, a, 10);
    *c = b;  
    delete[] a;
} 

Так будет правильно?

Вопрос (С):

 int *a = new int[10];  
 int *b = new int[100];
 CopyMemory(b, a, 10);
 delete[] a;  
 a = b;  

Здесь всё корректно?

Ответы

▲ 3Принят

Правильный ответ 1. В C++ нет сборщика мусора, поэтому вся ответственность за освобождение памяти лежит на разработчике.
2-ой ответ неправильный, т.к. a - это просто указатель, т.е. переменная хранящая адрес начала выделенного блока памяти и изменение указателя никак не повлияет на саму память.
Стоит отметить, что в С++ хорошим тоном считается использование умных указателей - классов оберток над указателями заботящихся об освобождении памяти (например auto_ptr из стандартной библиотеки).