Когда я должен выделить в куче? (C ++) - PullRequest
3 голосов
/ 02 июля 2010

Я не совсем понимаю, когда мне следует выделять память в куче и когда я должен выделять в стеке.Все, что я действительно знаю, это то, что распределение в стеке происходит быстрее, но, поскольку стек меньше, я не должен использовать его для выделения больших структур данных;что еще нужно учитывать при принятии решения о том, где распределять память?Изменить: где я должен разместить переменные экземпляра?

Ответы [ 4 ]

4 голосов
/ 02 июля 2010
  1. Выделите в стеке большинство объектов. Срок службы == сфера.
  2. Если вам нужно вручную контролировать время жизни объекта, разместите его в куче.
  3. Если объект большой, а стек недостаточно для него, выделите его в куче.
  4. Используйте идиому RAII (с плохими именами) в случаях 2 и 3, она позволяет вам использовать объекты в стеке, которые манипулируют ресурсами, которые могут быть вашими объектами в куче - хорошим примером являются умные указатели, такие как std :: shared_ptr / повышение :: shared_ptr.
2 голосов
/ 02 июля 2010

Используйте кучу, когда память должна сохраняться за пределами текущей функции.

0 голосов
/ 06 октября 2014

По моему опыту, выделение кучи наиболее полезно, когда вы хотите объявить размер массива объектов во время выполнения.

int numberOfInts;
cout << "How many integers would you like to store?: ";
cin >> numberOfInts;
int *heapArray = new int[numberOfInts];

Этот код даст вам массив массивов типа numberOfInts. Это также возможно сделать в стеке, но это считается небезопасным, и вы можете получить ошибку, названную в честь этого сайта.

0 голосов
/ 25 октября 2010

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

  • Отдельные объекты (как вы объявляете локальную int или double или MyClass temp1; переменную
  • массивы статического размера (как вы делаете, когда объявляете char local_buf[100]; или MyDecimal numbers[10];

Вы должны использовать кучу («свободный магазин»), когда вы знаете только, сколько места вам нужно во время выполнения, и вы должны , вероятно, использовать кучу для больших статически известных буферов. (например, не до char large_buf[321024];)

*1024* Обычно, однако, вы очень редко должны касаться кучи напрямую, но обычно используют объекты, которые управляют некоторой памятью кучи для вас (и объект, возможно, живет в стеке или как член другого объекта - там, где вы тогда не волнует, где живет другой объект)

Чтобы привести пример кода:

{
char locBuf[100]; // 100 character buffer on the stack
std::string s;    // the object s will live on the stack
myReadLine(locBuf, 100); // copies 100 input bytes to the buffer on the stack
s = myReadLine2();
  // at this point, s, the object, is living on the stack - however 
  // inside s there is a pointer to some heap allocated storage where it
  // saved the return data from myReadLine2().
}
// <- here locBuf and s go out-of-scope, which automatically "frees" all
//  memory they used. In the case of locBuf it is a noop and in the case of
//  s the dtor of s will be called which in turn will release (via delete)
//  the internal buffer s used.

Итак, чтобы дать краткий ответ на ваш вопрос , когда : Не выделяйте что-либо в куче (через new), если это не сделано с помощью соответствующего объекта-оболочки. (std :: string, std :: vector и т. д.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...