【发布时间】:2011-06-12 21:58:07
【问题描述】:
我有一个 vector<vector<Person*>*>* 称为组(是的,我知道 shared_ptr,但我不能在这种情况下使用它们),还有一个称为 partialGroups
无论如何,在方法的最后我删除了所有的内部向量,但没有删除人本身,因为我仍然希望它们有效,所以这里是代码的结尾:
// Deal with remaining partial teams
vector<Person*> *unsortable;
groups->push_back(unsortable);
// Remaining people
for(unsigned int i = 0; i < people.size(); i++) {
unsortable->push_back(people[i]);
}
// Remaining partial groups
for(unsigned int i = 0; i < partialGroups.size();i++) {
for(unsigned int j = 0; j < partialGroups[i]->size(); j++) {
unsortable->push_back(partialGroups[i]->at(j));
}
delete partialGroups[i];
}
return groups;
然后我用这行代码调用方法:
vector<vector<Person*>*> *currentMatch = sort(*people);
我可以一直运行 gdb 到返回组;声明,再看数据结构,就好了。但是,当我退出该方法时,程序崩溃了,堆栈跟踪显示它在向量析构函数本身中崩溃了。
到底是什么导致了这种情况? Person 析构函数应该不是问题,因为内部向量是指向人的指针。此外,取出删除行并没有什么不同。 (是的,我知道这会导致内存泄漏,但它可能有助于诊断问题)。
谢谢。
编辑:另外,错误是一个 sigabrt
【问题讨论】:
-
有什么理由不
std::vector<std::vector<Person*> >吗?没有理由在向量中有指向向量的指针。 -
你真的很喜欢指针dontcha?
-
你能发布一个完整的测试用例来展示这个问题吗?请仍然减少代码长度,但确认它只显示您不理解的问题,并且没有您可以理解的问题,例如编译器错误。马上,您上面的当前代码使用未初始化的不可排序的 UB。
-
@PigBen,@billy,嗯,我在数组中移动了很多东西,但是在这一点上,我真的不在乎了,所以我只是把它改回对象本身的数组,还是谢谢你。
-
@Fred,好吧,我发布了整个事情,因为它们是相关的,但我想它们可能不是。
标签: c++ pointers vector destructor