0

我声明:

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()”,然后抛出分段错误。迭代器如何在空向量中进行迭代????

更多信息

我正在使用 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,它们是相同的地址。

4

5 回答 5

2

我已经解决了这个问题,对象类 B 在一定范围后被破坏了。无论如何,谢谢你们!

于 2010-07-28T22:11:03.123 回答
1

for在你的循环之前添加这个断言。如果触发它,mList则已损坏。例如,也许包含类也已损坏/死/不是您认为的那样。

assert( mList.size() != 0 || mList.begin() == mList.end() )
于 2010-07-28T21:28:51.243 回答
0

列表是否在循环期间被修改,可能是通过回调?

于 2010-07-28T22:25:18.127 回答
0

您是否准确for粘贴了循环?如果你不小心有一只流浪狗;在你的 for 循环结束时,它实际上似乎会执行一次迭代并如你所见进行调用。

您是否直接在循环之前打印出列表大小以确保它实际上是空的?我能想到的唯一其他选择是该列表实际上不是空的,而是包含一个或多个垃圾元素。

于 2010-07-28T21:34:20.017 回答
0

也许不是你的情况的答案,但要注意 for 循环上的虚假尾随分号。

我经常写这个,当我发现它时不得不给自己一个很好的踢......

for(ListIterator it = mList.begin(); it!=mList.end(); it++);
    (*it)->someMethod();

它可以解释 someMethod 被调用的症状,即使 mList 为空(假设“它”以某种方式在其他地方的范围内)。

如果做不到这一点,我猜 mList 在您的 for 循环运行之前已损坏。IIRC 向量可以分别存储开始、结束和大小,所以如果有其他东西踩在“结束”上(例如将其归零),那么开始!=结束,但大小 == 0。

您总是可以以无迭代器的方式重写代码(好吧,我知道这可能只是掩盖了问题,但是,嘿......)

for (int i=0; i< mList.size(); i++)
  mlist[i]->someMethod();
于 2010-07-28T21:35:56.800 回答