我不确定是否可以生成可编译的示例,因为我的问题是调用第三方库,因此很难看到发生了什么(除非您安装了 RTI DDS)。但我会尽量使它成为一个完整的例子:
我正在使用带有 C++11 的 RTI DDS 库。这是一个可以工作的代码片段:
#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 库的内部深处:(
StatusCondition 的构造函数的 API 在这里:
dds::core::cond::StatusCondition::StatusCondition ( const dds::core::Entity & entity )
inline
获取对实体中 StatusCondition 的引用。参数。
entity 我们获得其状态条件的引用的实体。每个实体只有一个 StatusCondition,每个 StatusCondition 有一个实体。注意此构造函数不会创建新的条件。它获得对每个实体拥有的 StatusCondition 的引用。您可以根据需要多次使用此构造函数来获取对同一 StatusCondition 的引用。
所以看起来它正在引用由 shared_ptr 指向的 DataReader 的一些内部。
所以我的问题是,与原始指针相比,shared_ptr 在这种情况下是否不起作用?