在析构函数中检测到"试图释放无效指针"错误

wol*_*k88 2 c++

我正处于编写相当大的代码的开始阶段.我已经定义了一个类:

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

析构函数定义如下:

GPUMD::~GPUMD() {
    if(atoms != NULL)
        delete [] atoms;
}
Run Code Online (Sandbox Code Playgroud)

现在,代码执行此操作:

int main(int argc, char *argv[]) {
    GPUMD gpumd;
    exit(0);
}
Run Code Online (Sandbox Code Playgroud)

我得到一个glibc检测到错误:尝试释放无效指针.使用valgrind,我看到这个错误跟踪到我的析构函数GPUMD.由于某种原因,即使我没有为该指针指定任何内容,atoms!= NULL测试也会返回true.这是为什么?

编辑:构造函数定义为:

GPUMD::GPUMD() {}
Run Code Online (Sandbox Code Playgroud)

hmj*_*mjd 6

因为atoms尚未NULL在构造函数中显式初始化或有效指针.将构造函数更改为:

GPUMD::GPUMD() : numAtoms(0), atoms(NULL) {}
Run Code Online (Sandbox Code Playgroud)

请注意,atoms != NULL之前的检查delete[]是多余的delete[],或者delete,在NULL指针上是no-op.以下是安全的:

GPUMD::~GPUMD() {
    delete [] atoms;
}
Run Code Online (Sandbox Code Playgroud)

由于存在动态分配的成员,因此GPUMD需要防止复制实例GPUMD或实现赋值运算符和复制构造函数(请参阅什么是三规则?).

作为C++,请考虑使用vector<Atom>(或vector智能指针)来管理动态内存.