2016-07-28 75 views
0

我有载体的载体,就像这样:如何让我的shared_ptr的指向特定地址的嵌套向量内

std::vector<std::vector<boost::shared_ptr<X> > > vOP; 

我要指派另一boost::shared_ptr上述嵌套vector,然后计算/显示某些可视化。

这里是我的代码片段:

boost::shared_ptr<X> tempPtr; 

if(num < vOP[refID].size())  // refID returns the ID number 
{ 
    tempPtr = vOP[refID].at(num); 

    ROS_INFO_STREAM("ADDRESS OF vOP: "<< vOP[refID].at(num)<<" for refID: "<<refID); 
    ROS_INFO_STREAM("&REFERENCE ADDRESS OF vOP: "<< &vOP[refID].at(num)); 
} 

但我得到一个assertation失败错误为tempPtr没有指向该嵌套vector

我的代码在​​为0时有效;但否则我的代码失败。 ROS_INFO_STREAM的输出都是不同的地址。

有人可以向我解释这两个地址是什么意思?如何让我的指针指向正确的地址?

+0

您应该编辑您的问题以包含'ros'标签,从而增加获得答案的机会。 – 2016-07-28 21:02:36

+0

想一想,'num

+0

谢谢!我现在加了它! – Greatgoing

回答

1

比方说,你有:

typedef boost::shared_ptr<X> VectorContent; 
typedef std::vector<VectorContent> 1D_Vector; 
typedef std::vector<1D_Vector> 2D_Vector; 

然后:

vOP[refID].at(num)返回VectorContent&

&vOP[refID].at(num)返回VectorContent*

当你打印出来:

VectorContent&将调用boost::shared_ptr<X>::get()并打印boost::shared_ptr<X>所持的指针。

VectorContent*将打印boost::shared_ptr<X>本身的地址。

所以你得到两个不同的地址。

如果您想获得vector内部的boost::shared_ptr<X>的地址,请将tempPtr声明为boost::shared_ptr<X>&而不是它,因此它是参考而不是副本。

+0

感谢编辑Remy :) –

0

您在输出中得到两个不同的地址,因为您将两个不同的指针传递给operator<<开始。

vOP[refID].at(num)返回boost::shared_ptr<X>& -a 参考boost::shared_ptr<X>

Boost定义了一个operator<<,输出boost::shared_ptrstd::ostream。该操作员输出shared_ptr所持有的指针。所以,这条线:

ROS_INFO_STREAM("ADDRESS OF vOP: "<< vOP[refID].at(num)<<" for refID: "<<refID); 

实际上是一样的:

ROS_INFO_STREAM("ADDRESS OF vOP: "<< vOP[refID].at(num).get() <<" for refID: "<<refID); 

当您使用&地址操作上的参考,它返回被引用的项目的地址。在这种情况下,它将返回boost::shared_ptr对象本身的地址,而不是它所持有的指针。

如果你这样做:

boost::shared_ptr<X> tempPtr = vOP[refID].at(num); 
ROS_INFO_STREAM("ADDRESS OF vOP: " << &tempPtr << " for refID: " << refID); 

tempPtr是一个新的对象,复制X指针。您将输出tempPtr变量本身的地址,而不是输出到矢量内的boost::shared_ptr的地址。

如果你这样做,而不是:现在

boost::shared_ptr<X> &tempPtr = vOP[refID].at(num); 
ROS_INFO_STREAM("ADDRESS OF vOP: " << &tempPtr << " for refID: " << refID); 

tempPtr是一个参考,而不是副本。您将输出矢量内的boost::shared_ptr的地址。

相关问题