2016-12-14 3 views
0

Я использую boost 1.55 (io_service doc). Мне нужно вызвать деструктор на моем io_service для его сброса после того, как на моем последовательном устройстве будет задействовано питание, чтобы получить новые данные. Проблема в том, что когда деструктор вызывается дважды (перепробовать соединение), я получаю ошибку сегментации.boost :: asio :: io_service проверить, если null

В заголовочном файле

boost::asio::io_service io_service_port_1; 

В функции, которая закрывает соединение

io_service_port_1.stop(); 
io_service_port_1.reset(); 
io_service_port_1.~io_service(); // how to check for NULL? 
            // do I need to re-construct it? 

Ниже не работает:

if (io_service_port_1) 
if (io_service_port_1 == NULL) 

Спасибо.

+1

Вы не можете уничтожить объект дважды. Как только он уничтожен, он исчез. Поскольку вы явно вызываете деструктор, вы пытаетесь создать экземпляр нового экземпляра объекта? Почему вы все равно вызываете деструктор? –

+0

@CaptainObvlious Я излагаю свою причину выше (циклическое питание устройства). Как создать экземпляр нового экземпляра 'io_service'? – xinthose

+0

Выделите его в кучу и установите для него значение null в первый раз, когда вы его уничтожите? Или, возможно, используйте 'boost :: optional', если он предоставляет некоторый механизм для выполнения того, что вы хотите. – Arunmu

ответ

2

Если вам требуется ручное управление, когда объект создан и уничтожен, его следует обернуть в объект std::unique_ptr.

std::unique_ptr<boost::asio::io_service> service_ptr = 
    std::make_unique<boost::asio::io_service>(); 

/*Do stuff until connection needs to be reset*/ 
service_ptr->stop(); 
//I don't know your specific use case, but the call to io_service's member function reset is probably unnecessary. 
//service_ptr->reset(); 
service_ptr.reset();//"reset" is a member function of unique_ptr, will delete object. 

/*For your later check*/ 
if(service_ptr) //returns true if a valid object exists in the pointer 
if(!service_ptr) //returns true if no object is being pointed to. 

Вообще говоря, вы никогда не должны непосредственно вызывать ~object_name();. Когда-либо. Когда-либо. Когда-либо. Существует несколько причин:

  • Как обычная часть Stack Unwinding, это будет вызвано так или иначе, когда метод вернется.
  • delete Назовите его указателем.
  • «Умные указатели» (например, std::unique_ptr и std::shared_ptr) будут называть это, когда они саморазрушаются.

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

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