Сбой при передаче unique_ptr или shared_ptr функции третьей стороны, которая принимает ссылку на указанный объект - PullRequest
0 голосов
/ 10 мая 2018

Я не уверен, что смогу привести пример для компиляции, потому что моя проблема - это вызов сторонней библиотеки, поэтому трудно увидеть, что происходит (если у вас не установлен RTI DDS).Но я постараюсь сделать его как можно более полным примером:

Я использую библиотеку RTI DDS с C ++ 11.Вот фрагмент кода, который будет работать:

#include <dds/dds.hpp> // the RTI libs
int main()
{
    dds::domain::DomainParticipant participant(0); // 0 is domain_id
    dds::topic::Topic<MyTopic> topic(participant, "example");
    dds::sub::DataReader<MyTopic> *reader = new dds::sub::DataReader<MyTopic>(dds::sub::Subscriber(participant), topic);

    // Now pass the dereferenced reader pointer to the status condition c'tor
    dds::core::cond::StatusCondition condition(*reader);

    return 0;
}

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

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

Так что я подумал, может быть, здесь можно использовать общий указатель:

#include <dds/dds.hpp> // the RTI libs
int main()
{
    dds::domain::DomainParticipant participant(0); // 0 is domain_id
    dds::topic::Topic<MyTopic> topic(participant, "example");
    std::shared_ptr<dds::sub::DataReader<MyTopic>> shared_ptr_reader = std::shared_ptr<dds::sub::DataReader<MyTopic>>(new dds::sub::DataReader<MyTopic>(dds::sub::Subscriber(participant), topic));

    // Now pass the dereferenced reader pointer to the status condition c'tor
    dds::core::cond::StatusCondition condition(*shared_ptr_reader); // <-- Crashes here

    return 0;
}

Это приводит к сбою - выдает низкоуровневый RTI, за исключением того, что трассировка стека действительно не помогает мне, так как егов глубине души библиотеки RTI: (

API для конструктора StatusCondition находится здесь:

dds::core::cond::StatusCondition::StatusCondition  ( const dds::core::Entity &  entity )  
 inline  

Получает ссылку на StatusCondition в объекте. Параметры.

entity Объект, на состояние состояния которого мы получаем ссылку. Существует ровно одно StatusCondition для объекта и один объект для StatusCondition. ПримечаниеЭтот конструктор не создает новое условие. Он получает ссылку на StatusCondition.что каждый объект имеет. Вы можете использовать эти конструкторы столько раз, сколько необходимо для получения ссылки to то же условие состояния.

Похоже, что оно ссылается на некоторый внутренний объект DataReader, на который указывает shared_ptr.

Так что мой вопрос, есть ли причина, по которойshared_ptr не будет работать в этом случае по сравнению с необработанным указателем?

...