2012-05-30 4 views
2

В C++, как функция обрабатывает память, динамически распределяемую при выходе из области действия? Удалена ли эта память или ее можно вернуть обратно в основной блок?Выполняет функцию очистки динамической памяти при выходе из области?

В контексте: У меня есть функция, и я передаю ей указатель на двойной, чтобы служить в качестве массива. Я динамически выделяю эту память внутри функции, инициализирую элементы и выхожу из функции.

  void my_func(double* ptr){ 
      ptr = new double[2]; 
      ptr[0] = 15; ptr[1] = 10; 
      } 

В основном блоке я использую вновь выделенный массив.

Будет ли это работать? Существуют ли опасения/подводные камни, связанные с этим подходом?

ответ

11

В C++ как функция обрабатывает память, динамически распределяемую при выходе из области действия? Удалена ли эта память или ее можно вернуть обратно в основной блок?

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

В контексте: У меня есть функция, и я передаю ей указатель на двойной, чтобы служить в качестве массива. Я динамически выделяю эту память внутри функции, инициализирую элементы и выхожу из функции.

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

void my_func(double*& ptr) 
{ 
    ptr = new double[2]; 
    ptr[0] = 15; ptr[1] = 10; 
} 
Будет ли

эту работу? Существуют ли опасения/подводные камни, связанные с этим подходом?

В основном это будет работать, но не для того, чтобы идти на C++ из-за связанных ошибок. Лучше идти с vector:

std::vector<int> my_func() 
{ 
    std::vector<int> buffer; 
    buffer.push_back(15); 
    buffer.push_back(10); 
    return buffer; 
} 
+0

Очень информативный ответ! Спасибо :-) – Xahdoom

+0

'поэтому, пока вы можете изменить (как определено стандартами), содержимое указателя указывает на' - true, только когда указателю уже выделена некоторая память.В этом случае 'ptr = new double [2]' заставит указатель 'ptr' указывать на законно распределенную память, и на этом этапе конец ptr (в основном) на ptr (в функции) заканчивается. – sjsam

0

Будет ли это работать? Существуют ли опасения/подводные камни, связанные с этим подходом?

Это может работать до тех пор, пока ничего не получится. Если исключение будет выбрано, оно, как правило, будет утечка памяти. Чтобы этого избежать, вы обычно хотите освободить память в деструкторе какого-либо класса, а затем создать экземпляр этого класса с автоматическим временем хранения. Это означает, что он будет уничтожен, когда он выходит из сферы действия, и будет (в свою очередь) освобождать память, которую он контролирует.

В стандартной библиотеке уже есть множество контейнеров для этого. То, что у вас есть, ближе всего к std::vector, но есть также std::deque, std::list и т. Д.

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

  • Нет связанных вопросов^_^