gpt4 book ai didi

c++ - "Trying to free invalid pointer"在析构函数中检测到错误

转载 作者:搜寻专家 更新时间:2023-10-31 00:00:29 26 4
gpt4 key购买 nike

我正处于编写相当大的代码的开始阶段。我这样定义了一个类:

class GPUMD {
private:
double xhi, xlo, yhi, ylo, zhi, zlo;
int numAtoms;
Atom *atoms;
public:
GPUMD();
~GPUMD();
};

析构函数定义如下:

GPUMD::~GPUMD() {
if(atoms != NULL)
delete [] atoms;
}

现在,代码是这样做的:

int main(int argc, char *argv[]) {
GPUMD gpumd;
exit(0);
}

我收到 glibc 检测到的错误:试图释放无效指针。使用 valgrind,我发现此错误可追溯到我的 GPUMD 析构函数。出于某种原因,atoms != NULL 测试返回 true,即使我没有为该指针分配任何内容。这是为什么?

编辑:构造函数定义为:

GPUMD::GPUMD() {}

最佳答案

因为 atoms尚未明确初始化为 NULL或构造函数中的有效指针。将构造函数更改为:

GPUMD::GPUMD() : numAtoms(0), atoms(NULL) {}

请注意 atoms != NULLdelete[] 之前检查是多余的 delete[] , 或 delete , 在 NULL 上指针是空操作。以下是安全的:

GPUMD::~GPUMD() {
delete [] atoms;
}

由于GPUMD中有一个动态分配的成员您需要防止复制 GPUMD 的实例或实现赋值运算符和复制构造函数(参见 What is The Rule of Three? )。

作为 C++,考虑使用 vector<Atom> (或 vector 的智能指针)代替,它将为您管理动态内存。

关于c++ - "Trying to free invalid pointer"在析构函数中检测到错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13075826/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com