第一个解决方案是:
std::vector<int> *vec = new std::vector<int>;
assert(vec != NULL);
// ...
delete vec;
Run Code Online (Sandbox Code Playgroud)
另一种选择是:
std::vector<int> v;
//...
vec.clear();
vec.swap(std::vector<int>(vec));
Run Code Online (Sandbox Code Playgroud)
第二种解决方案有点诀窍 - 这种"正确"方式是什么?
我知道析构函数一旦离开堆栈就会被调用,我很好奇其他方法.
我有一个指向类的指针向量.我需要打电话给他们的析构函数并释放他们的记忆.因为它们是指针向量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;
}
}
Run Code Online (Sandbox Code Playgroud)
那里的printf因为我有一个会说话的析构函数,可以看到哪个染色体发生了分段错误.当调用clearPool()并说我们得到100的大小时,它可以在0到100之间的任何染色体中给出分段错误.
我不知道为什么会发生这种情况,也没有办法真正找到错误,因为在使用断点进行调试时,我看到的是它发生在随机染色体上.
我正在使用codeblocks IDE和gdb调试器.发生分段故障时的堆栈跟踪有4个内存地址和一个函数wsncpy().