Справка по неуправляемой сборке мусора в C ++ - PullRequest
3 голосов
/ 27 августа 2010

Я программист .net, без большого опыта работы с неуправляемым кодом.Я добавляю модификации и дополнения в неуправляемый проект, и все работает нормально.Можете ли вы дать мне несколько советов относительно того, какой код / ​​объекты мне нужно беспокоиться в отношении сбора мусора?

Ответы [ 6 ]

9 голосов
/ 27 августа 2010

Отсутствует. C ++ не имеет сборщика мусора.

7 голосов
/ 27 августа 2010

На C ++, когда вы выделяете память вручную с помощью оператора new, ваша задача освободить эту память позже (когда она больше не нужна) с помощью оператора delete.разница между new / delete и malloc / free?

3 голосов
/ 27 августа 2010

Если у вас все в стеке или вы создаете элементы в контейнеры, такие как vector, вам не нужно беспокоиться о памяти.

Однако, вероятно, вы используете хотя бы некоторую форму выделения памяти (new / malloc / createobject / globalalloc / sysstring /...)

MSVC (COM) ATL обеспечивает управление типами RAII, помогая управлять временем жизни объектов
CComPtr<> будет управлять областью
CComQIPtr<> также будет управлять областью действия, но также изменится на указанный тип при назначении.

C ++ имеет std::auto_ptr<>, который немного староват и устарел Boost / tr1 имеет несколько общих / общих типов для управления ptr и массивами - использование зависит от того, используете ли вы новый или новый [], чтобы он мог вызвать правильное удаление или удаление []

2 голосов
/ 27 августа 2010

Карлфиллип даст вам хороший совет.

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

Вы должны быть осторожны, потому что, если вы дважды удалите что-то, ваша программа взорвется.

Есть полезный трюк, чтобы определить, был ли объект удален.

после их удаления вы можете установить указатель на ноль

delete foo;
foo=null;

в следующий раз вы можете проверить, равно ли оно нулю, и в противном случае удалить их. И самое лучшее ... даже если вы попытаетесь удалить нулевой указатель, ничего не произойдет! :)

2 голосов
/ 27 августа 2010

Вы отметили этот COM. Если это так, вы отвечаете за вызовы AddRef () и Release () в зависимости от того, какие COM-объекты вы используете. Они управляют функциями подсчета ссылок в COM и не связаны с сборщиком мусора .NET.

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

0 голосов
/ 03 сентября 2010

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

...