1

我不确定是否可以生成可编译的示例,因为我的问题是调用第三方库,因此很难看到发生了什么(除非您安装了 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 在这种情况下是否不起作用?

4

0 回答 0