C ++ и Smart Pointers - как умные указатели помогут в этой ситуации? - PullRequest
1 голос
/ 22 сентября 2009

К моему стыду, у меня не было возможности использовать умные указатели в реальной разработке (супервизор считает это слишком "сложным" и пустой тратой времени). Тем не менее, я планировал использовать их для своих собственных вещей ...

У меня возникают ситуации, связанные с деинсталляцией модуля после того, как он сделан или когда загружаются новые данные. Поскольку я использую указатели, я обнаружил, что мой код завален проверкой на ноль, такой как эта ...

// TODO: Reset all opened windows

// Deinit track result player
if (trackResultPlayer_)
    trackResultPlayer_->reset();

// disconnect track result player
disconnect(trackResultPlayer_);

disconnect(trackResultAnimator_);
}

if (videoPlayerWindow_)
{
    videoPlayerWindow_->reset();

    // Disconnect the video player window from source movie data
    disconnect(videoPlayerWindow_);
}

// Disconnect this module from its children as they would be connected again
disconnect(this);

Если я хочу использовать умные указатели вместо необработанных указателей, как можно решить эту проблему?

Ответы [ 3 ]

4 голосов
/ 22 сентября 2009

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

Создайте экземпляр класса и оберните его в boost::shared_ptr.

Затем передайте копии этого каждой функции, которой нужен доступ к экземпляру.

А интеллектуальный указатель гарантирует, что после того, как объект больше не используется (когда все общие указатели были уничтожены), объект, на который они указывают, уничтожается. его деструктор запускается, и вся очистка выполняется.

Как всегда в C ++, используйте RAII, когда это возможно.

Когда у вас есть код, такой как x.reset() или disconnect(x), первое, что вы должны сделать, это спросить себя: «Разве это не относится к деструктору?»

Далее, всякий раз, когда вы используете x->y(), вы должны спросить себя:

  • Почему это указатель? Не могу ли я обойтись одним экземпляром, размещенным в стеке, и, возможно, несколькими ссылками на него?
  • Если это должен быть указатель, почему это не умный указатель?
2 голосов
/ 22 сентября 2009

Проверка на NULL не является проблемой - и умные указатели в любом случае не вмешиваются.

2 голосов
/ 22 сентября 2009

Умный указатель - это прежде всего инструмент для управления памятью, на которую указывает. Они не предназначены для чего-то, что освободило бы вас от бремени проверки значения NULL ...

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

...