Удаление закрытия в списке инициализатора (C ++ 0x) и предупреждение компилятора - PullRequest
0 голосов
/ 15 июня 2011

Я получаю warning C4355: 'this' : used in base member initializer list из Visual C ++ 2010:

У меня есть класс, содержащий дескриптор, и я хочу автоматически закрыть дескриптор , даже если ctor для класса выходит из строя (поэтому его dtor не вызывается). Тем не менее, я не хочу беспокоиться о создании целого класса обтекания дескриптора, а скорее держу его в умном указателе. И вот я написал это:

foo.h
~~~~~
class Foo
{
    ...
    Log &_log;
    std::unique_ptr<void, std::function<void (void *)>> _handle;
    ...
}

foo.cpp
~~~~~~~
#include <windows.h>
Foo::Foo(Log &lg, ...) : _log(lg), ... _handle(nullptr, [&](void *h){ if (h) { if (!CloseHandle(h)) LOG(_log, "Could not close port: " << LastWinErr()); h = nullptr; } })
{
    HANDLE h(CreateFile( ...
    if (h == ...
    _handle.reset(h);
    ... // Bunch of other stuff that could potentially throw
}

До закрытия я инициализировал _handle чем-то вроде _handle(nullptr, bind(PortDeleter, placeholders::_1, ref(_log))), но для этого требуется отдельное определение.

Мои вопросы: предупреждение относится к этому конкретному случаю? В любом случае, в чем детальная причина? Есть ли тривиальный способ избежать этого?

1 Ответ

1 голос
/ 15 июня 2011

Суть в том, что если вы передаете указатель this и он используется для доступа к функциям-членам или переменным в списке инициализатора или в деструкторе Bad Things Happen ™.Если вы знаете, что этого не произойдет, не стесняйтесь игнорировать предупреждение.Конечно, это также хорошее предупреждение - если какие-либо функции или переменные, к которым вы обращаетесь в деструкторе, принадлежат классу, это небезопасно, так как вы можете обращаться к ним до их создания / после их уничтожения.Проблема не критична, если вы знаете свои приказы на инициализацию / уничтожение, но, как правило, это плохой ход, поскольку в лучшем случае это делает обслуживание довольно трудоемким.Поскольку вы могли бы захватить параметр конструктора вместо этого, я бы рекомендовал это.

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