【问题标题】:Vector destructor causing program to crash in C++向量析构函数导致程序在 C++ 中崩溃
【发布时间】: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&lt;std::vector&lt;Person*&gt; &gt; 吗?没有理由在向量中有指向向量的指针。
  • 你真的很喜欢指针dontcha?
  • 你能发布一个完整的测试用例来展示这个问题吗?请仍然减少代码长度,但确认它只显示您不理解的问题,并且没有您可以理解的问题,例如编译器错误。马上,您上面的当前代码使用未初始化的不可排序的 UB。
  • @PigBen,@billy,嗯,我在数组中移动了很多东西,但是在这一点上,我真的不在乎了,所以我只是把它改回对象本身的数组,还是谢谢你。
  • @Fred,好吧,我发布了整个事情,因为它们是相关的,但我想它们可能不是。

标签: c++ pointers vector destructor


【解决方案1】:

如果这个代码 sn-p 是准确的,那么你正在用一个未初始化的指针 unsortable 做各种各样的事情。我很惊讶它会从方法中退出。

【讨论】:

  • 天哪,哇,我已经在这太久了,非常感谢你,我相信这是问题所在,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-28
  • 2013-04-13
  • 1970-01-01
  • 1970-01-01
  • 2014-12-15
  • 2015-04-29
相关资源
最近更新 更多