假设我Object o
包含一个定义为:
std::vector<V *> V;
我有一个吸气剂:
inline std::vector<V *>& getV() { return V; };
如果我通过引用传递参数:
void A::function(Object& o)
并尝试访问std::vector V
;
我该怎么做?
void A::function(Object& _o)
{
for (int f=0; f < _o.getV().size(); f++)
{
V* _v = _o.getV().at(f);
std::string s = _v->getName().c_str();
std::cout << "V: " << _v->getName().at(f) << std::endl;
std::cout << "V: " << s << std::endl;
}
}
}
如果我在尝试访问上面的_v->getName()
时崩溃,我会犯下什么错误。
如果我看一下崩溃,我确实看到_v已经填补了位置:
V std::__1::vector<V *, std::__1::allocator<V *> > size=8
[0] V * 0xbfffd658 0xbfffd658
[1] V * 0xbfffd658 0xbfffd658
[2] V * 0xbfffd658 0xbfffd658
[3] V * 0xbfffd658 0xbfffd658
[4] V * 0xbfffd658 0xbfffd658
[5] V * 0xbfffd658 0xbfffd658
[6] V * 0xbfffd658 0xbfffd658
[7] V * 0xbfffd658 0xbfffd658
更新:所以看起来前一个开发者在某一点做了类似的事情
在.h
Object* o1;
in .a cpp
void B::function(Object& _o)
{
o1 = &_o;
.... does stuff with o1 .....
}
在另一个.cpp中传入原始的object o
来处理它的内容:
void A::function(Object& _o)
{
for (int f=0; f < _o.getV().size(); f++)
{
V* _v = _o.getV().at(f);
std::string s = _v->getName().c_str();
std::cout << "V: " << _v->getName().at(f) << std::endl;
std::cout << "V: " << s << std::endl;
}
}
}
答案 0 :(得分:0)
我无法解释在您发布的代码中究竟发生了什么,但没有更多信息,但由于您的问题似乎已经解决,as per requested,使用指针向量很难做到正确并且应该仅用于某些情况,例如当你意识到可能会有巨大的性能提升(在测试之后)或你正在处理的类型是不可复制的等等。另外,在处理指针时,你必须格外注意对象的生命周期,正确的复制(深拷贝与浅拷贝),正确的比较(指针与实际对象之间的比较)并且很难做到正确。因此,请始终将对象直接存储在容器中,并在必要时更改为指针向量。