相关疑难解决方法(0)

解除std :: vector对象的"正确"方法

第一个解决方案是:

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)

第二种解决方案有点诀窍 - 这种"正确"方式是什么?

更新:

我知道析构函数一旦离开堆栈就会被调用,我很好奇其他方法.

c++ memory-management stl vector

34
推荐指数
3
解决办法
7万
查看次数

C++ std ::指针删除和分段错误的向量

我有一个指向类的指针向量.我需要打电话给他们的析构函数并释放他们的记忆.因为它们是指针向量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().

c++ pointers memory-management segmentation-fault

5
推荐指数
2
解决办法
2万
查看次数