C++ std::vector 指针删除和分段错误

2023-12-24

我有一个指向类的指针向量。我需要调用它们的析构函数并释放它们的内存。由于它们是指针向量 vector.clear() 不能完成这项工作。所以我继续像这样手动完成:

void Population::clearPool(std::vector<Chromosome*> a,int size)
{
    Chromosome* c;
    for(int j = 0 ;j < size-1;j++)
    {
       c = a.back();
       a.pop_back();
       delete c;
       printf("  %d \n\r",j);
       c = NULL;

    }

}

那里的 printf 是因为我有一个会说话的析构函数来查看分段错误发生在哪个染色体中。当调用 clearPool() 并说我们得到的大小为 100 时,它可能会在 0 到 100 之间的任何染色体中给出分段错误。

我不知道为什么会发生这种情况,也没有办法真正找到问题所在,因为在使用断点进行调试时,我看到的只是它发生在随机染色体上。

我正在使用 codeblocks IDE 和 gdb 调试器。发生分段错误时的堆栈跟踪有 4 个内存地址和一个函数wsncpy().


void Population::clearPool( std::vector <Chromosome*> & a )
{
   for ( int i = 0; i < a.size(); i++ ) {
      delete a[i];
   }
   a.clear();
}

请注意,向量是通过引用传递的。在您的代码中,使用向量的副本,这意味着它在调用程序中未更改。因为您删除了副本中的指针,所以原始中的指针现在全部无效 - 我怀疑您正在以某种方式使用这些无效指针,而这些方式未在您发布的代码中显示。

由于已经发布了一些使用 C++ 库算法的模板解决方案,您可能还需要考虑不具备以下功能的模板解决方案:

template <class C> void FreeClear( C & cntr ) {
    for ( typename C::iterator it = cntr.begin(); 
              it != cntr.end(); ++it ) {
        delete * it;
    }
    cntr.clear();
}

使用它,您可以释放动态分配对象的任何容器:

vector <Chromosome *> vc;
list <Chromosome *> lc;
// populate & use
FreeClear( lc );
FreeClear( vc );
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ std::vector 指针删除和分段错误 的相关文章

随机推荐