Я не уверен, смогу ли я привести пример для компиляции, потому что моя проблема — это вызов сторонней библиотеки, поэтому трудно увидеть, что происходит (если у вас не установлен 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 в объекте. Параметры.
Сущность Сущность, на состояние которой мы получаем ссылку.
Существует ровно одно StatusCondition на сущность и одна сущность на
StatusCondition. ПримечаниеЭтот конструктор не создает новое условие.
Он получает ссылку на StatusCondition, которым владеет каждый объект.
Вы можете использовать эти конструкторы столько раз, сколько необходимо для получения
ссылка на то же StatusCondition.
Таким образом, похоже, что он ссылается на некоторый внутренний объект DataReader, на который указывает shared_ptr.
Поэтому мой вопрос: есть ли причина, по которой shared_ptr не будет работать в этом случае по сравнению с необработанным указателем?
Задача ещё не решена.
Других решений пока нет …