Является ли область действия unique_ptr постоянной? - PullRequest
0 голосов
/ 12 декабря 2011

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

Причина, по которой я хочуполагаться на этот факт является то, что я хочу написать простой класс для ведения журнала, который говорит, когда он вошел / вышел из метода, что-то вроде:

class MethodTracing
{
    string _signature;

    public:
        MethodTracing(string signature)
        {
            _signature=signature;
            BOOST_LOG_TRIVIAL(trace) << "ENTERED " << _signature ;
        }

        ~MethodTracing()
        {
            BOOST_LOG_TRIVIAL(trace) << "EXITED " << _signature;
        }
};

Затем я могу использовать его так:

void myMethod( )
{
    auto _ = unique_ptr<MethodTracing>(new MethodTracing(__FUNCSIG__) ) ;
    /// ... 
}

Верно ли (и непротиворечиво), что unique_ptr при создании в методе уничтожается в конце метода (при условии, что он не передается).

Есть ли какие-либо другие скрытые (или иные!) Ловушки, о которых мне следует знать?

Обновление: Как и предлагалось в большинстве ответов, я мог бы использовать местныйпеременная область видимости.Я пробовал это с MethodTracing(__FUNCSIG__);, но, конечно, я не назначил локальную переменную! , поэтому она сразу вышла из области видимости.Я думал, что среда выполнения была умной, но нет, я был глуп (слишком долго в C #!)

Ответы [ 5 ]

3 голосов
/ 12 декабря 2011

Вам не нужно этого делать - полагайтесь на автоматическое хранение, например,

void myMethod( )
{
  MethodTracing __sig(__FUNCSIG__);

  // do stuff
}

__sig будет автоматически уничтожено в конце области действия функции

(да __sig это плохая форма, назовите это как-нибудь еще, если хотите)

2 голосов
/ 12 декабря 2011

Да, unique_ptr уничтожается в конце области, в которой он создан. Однако вам не нужен unique_ptr, чтобы получить эту функциональность, потому что все классы C ++ имеют это.Вы также можете просто создать свой объект MethodTracing напрямую:

void myMethod( )
{
    MethodTracing _(__FUNCSIG__);
    /// ... 
}
2 голосов
/ 12 декабря 2011

Обычно на это можно положиться.Исключением будет код, который явно вызывает terminate().Как правило, деструкторы объектов вызываются, когда они выходят из области видимости (для локальных переменных это конец метода).Это основа RAII .

1 голос
/ 12 декабря 2011

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

Лично я бы просто объявилэто в стеке, как упомянуто выше.

1 голос
/ 12 декабря 2011

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

Однако при вызове метода exit () следует позаботиться о завершении программы. Локальная автоматика, такая как ваш уникальный ptr, не будет уничтожена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...