[英]Crazy C++ Vector iterator
我声明:
typedef std::tr1::shared_ptr<ClassA> SharedPtr;
接着:
std::vector<SharedPtr> mList;
和:
typedef std::vector<SharedPtr>::iterator ListIterator;
mList.size()
的返回值为0,但是当我使用迭代器时,它将遍历为空的向量! 这就是我使用迭代器的方式:
for(ListIterator it = mList.begin(); it!=mList.end(); it++)
(*it)->someMethod();
它执行“ someMethod()
”,然后引发Segmentation Fault。 迭代器如何在空向量中迭代?
我正在使用GTK,因此这是我传递主要对象的方式:
g_signal_connect(G_OBJECT(widget), "event", G_CALLBACK(&ClassB::fun), this)
this
就是ClassB本身 。
然后我收到这样的消息:
gboolean ClassB::fun(GtkWidget *widget, GdkEvent *event, ClassB *data)
{
// The mList is here, and is accessed like this:
// data->mList
}
按照我引用的方式声明了mList
,当我访问其他属性时,假设data->xxx
可以正常工作,而且很好,仅在mList
出现了问题,并且该属性未动态分配。
我已经检查了*data
和this
的内存地址,它们是相同的地址。
我已经解决了这个问题,对象类B在某个作用域之后被销毁了。 无论如何,谢谢大家!
在您的for
循环之前添加此断言。 如果触发它, mList
已损坏。 例如,也许包含的类也已损坏/不可用/不是您认为的那样。
assert( mList.size() != 0 || mList.begin() == mList.end() )
你粘贴for
循环到底是什么 ? 如果你偶然迷路了; 实际上,在for循环的最后,它似乎执行了一次迭代并按照您所看到的进行了调用。
您是否在循环之前直接打印了列表大小以确保它实际上是空的? 我能想到的唯一其他选择是列表实际上不是空的,而是包含一个或多个垃圾元素。
在您的情况下,可能不是答案,但是请注意for循环上的虚假尾部分号。
我经常写这篇文章,当我发现它的时候必须给自己一个好的踢...
for(ListIterator it = mList.begin(); it!=mList.end(); it++);
(*it)->someMethod();
即使mList为空(假设“ it”在某种程度上在其他范围内),它也可以解释出调用someMethod的症状。
失败的话,我猜mList在for循环运行之前已损坏。 IIRC向量可以分别存储“开始”,“结束”和“大小”,因此,如果在““结束””上有其他问题(例如将其清零),则开始!= end,但是大小== 0。
您总是可以以无迭代器的方式重写代码(好的,我知道这可能掩盖了问题,但是,嘿...)
for (int i=0; i< mList.size(); i++)
mlist[i]->someMethod();
列表是否在循环过程中被修改(可能通过回调)?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.