2010-12-17 3 views
4

Прямо сейчас, владение/удаление объекта в моем проекте на C++ отслеживается вручную (с помощью комментариев в основном). Почти каждый куча выделенного объекта создается с использованием фабрики сортовРучная собственность на объект против смарт-указателей

например.

auto b = a->createInstanceOfB(); //a owns b 
auto c = b->createInstanceOfC(); //b owns c 
//auto k = new K(); //not in the code 
... 
//b is no longer used.. 
a->destroyInstanceOfB(b); //destroyInstanceOf calls delete on it 

Какие преимущества, если таковые имеются, будут содержать интеллектуальные указатели в этой постановке?

+0

Что вы подразумеваете под "a own b"? И как вы сейчас удаляете вещи? – 2010-12-17 12:16:08

+0

У меня есть b, я имею в виду a создает b и разрушает b. – jameszhao00 2010-12-17 12:25:13

ответ

9

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

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

Тип единственного владельца (std::auto_ptr) также освобождает вас от вашей дезинтеграционной обязанности, но он позволяет только одному владельцу одновременно (хотя право собственности может быть передано). Это полезно для объектов, которые вы передаете в качестве указателей, но вы все равно хотите, чтобы они автоматически очищались, когда они выходили из области действия (чтобы они хорошо работали в контейнерах, а разворот стека в случае исключения работает, как ожидалось).

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

1

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

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

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

2

Умные указатели обеспечивают соблюдение семантики владения, то есть гарантируется, что объект будет освобожден правильно даже в случае исключений. Вы всегда должны использовать их исключительно из-за безопасности, даже если они выражают только очень простую семантику, такую ​​как std :: unique_ptr. Более того, указатель, который применяет семантику, уменьшает необходимость документировать его, и меньше документации означает, что документация устарела или некорректна, особенно если несколько частей одной и той же программы выражают одну и ту же семантику.

В конечном счете, интеллектуальные указатели уменьшают количество источников ошибок, и нет оснований не использовать их.

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