2015-04-17 5 views
-1

Вот мои мысли о управлении C++ Memeory, пожалуйста, не стесняйтесь комментировать.Управление памятью на С ++: RAII, Умные указатели и GC

Память может быть выделена в стек или куча.

Правило 1:

Если два вложенные стеки необходимо обмениваться данными, использовать RAII выделения памяти в стека, как показано ниже:

func1() { 
    Resource res; // res will be destructed once func1 returns 
    func2(&res); 
} 

Правило 2:

Если два параллельных стеков необходимо обмениваться данными (не полями членов класса), память должна быть выделена в кучей, используйте Smart Points или GC. Например:

func() { 
    shared_ptr<Resource> res = func1(); // returned a shared ptr to a memory allocated in func1 
    func2(res); 
} 

Правильно ли я?

+1

Какой ваш вопрос именно? И в отношении чего, стандарт? Поскольку строго говоря, C++ не имеет понятия о «стеке» или «куче», по крайней мере, не при обсуждении модели памяти. – user657267

+0

RAII, shared_pointer используются, когда участвует полиморфизм – billz

ответ

0

Мое мнение таково, что вы правы, (параллельные стеки означает многопоточного я полагаю)

Кроме того, это нормально использовать scoped_ptr (повышение) или unique_ptr (C++ 11) в первом случае. В этом случае объект выделяется в памяти heap вместо stack. и RAII также освобождает эту память после завершения области.

shared_ptr является механизмом счетчика ссылок, так что если другой объект держать shared_ptr (в вашем случае: func2), и не выпустить его после того, как ваш func сфера закончена, объект shared_ptr по-прежнему доступен.

+0

Пример для случая 2 является однопоточным, поэтому я думаю, что вы слишком много читаете в этом. – MSalters

+0

@MSalters Я действительно не понимаю параллельные стеки, потому что в одном потоке может быть только один стек за раз. – Gohan

+0

Гохан, да, у одной нити есть только один стек. Здесь я рассматриваю функцию как один стек. – Zach

0

No. Ваш пример 2 лучше написано как только

void func() { 
    Resource res = func1(); // func1 returns a Resource 
    func2(res); // func2 uses that Resource. 
} 
+0

Я не согласен с вами. «Res» уничтожается после того, как он покидает func1(), поэтому должен возвращать необработанный указатель (вручную удалить после func2()) или smart_pointer. Если вы имеете в виду, что «res» содержит указатель на блок памяти внутри, то сам «res» является умным указателем. – Zach

+0

@ Zach: Неправильно. 'res' даже не _exist_ в' func1', поэтому его нельзя уничтожить. Но просто попробуйте его с помощью 'std :: string' в качестве ресурса: Из' func1', возвращаем 'std :: string (" Hi ")' и видим, что приведенный выше код передаст Hi 'func2'. – MSalters

+0

std :: строка подсчитывается. См .: http://stackoverflow.com/questions/12520192/is-stdstring-refcounted-in-gcc-4-x-c11 – Zach

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