2013-04-30 4 views
1

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

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

+2

Короткий ответ: невозможно. –

+0

Могли бы вы более подробно остановиться на том, чего вы пытаетесь достичь с этим? сколько памяти вам нужно? на какой системе с какой целью? Я не думаю, что есть чистый способ сделать это с новыми, но новые используют системные символы, такие как sbrk, которые выделяют большие пулы, которые вы могли бы использовать в новостях размещения для создания там объектов. но это все очень зависит от того, что вы хотели бы достичь с ним. PS: Запах, как сбор мусора или обнаружение утечки. – Alex

ответ

6

Самый простой способ сделать сделать то, что вы хотите использовать smart pointers

Вы можете использовать:

«Интеллектуальные указатели являются объекты, которые хранят указатели на динамически выделенных (кучи) объектов. Они ведут себя так же, как встроенные указатели C++ , за исключением того, что они автоматически удалите объект, на который указывает , соответствующее время. Умные указатели особенно полезны в лице исключений, поскольку они обеспечивают надлежащее уничтожение динамически выделенных объектов. Они также могут использоваться для отслеживания динамических выделенных объектов, совместно используемых несколькими владельцами.

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

станд :: unique_ptr является смарт-указатель, который сохраняет исключительное право собственности на O bject через указатель и уничтожает этот объект, когда unique_ptr выходит за рамки. Нет двух экземпляров unique_ptr, которые могут управлять одним и тем же объектом .

std :: shared_ptr - это умный указатель, который сохраняет общий доступ к объекту через указатель. Несколько объектов shared_ptr могут иметь один и тот же объект .

+3

C++ предоставляет свои собственные умные указатели: см. 'Std :: unique_ptr' и' std :: shared_ptr'. – stefan

+0

@stefan Я добавлял стандарт C++ 11, когда вы прокомментировали! Спасибо, в любом случае. – 888

+0

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

0

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

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

3

Вы находитесь рядом с решением проблемы.Стандарт говорит об автоматическом/динамическом управлении памятью, который обычно представляет собой прямой перевод распределений стека/кучи.

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

В вашем случае мне кажется, что простым решением будет иметь std::vector<MyObject>, а затем просто создать объект непосредственно в vector. Под ним, вероятно, используется new, но вам не придется беспокоиться об этом: инкапсуляция камней.

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