我正处于编写相当大的代码的开始阶段.我已经定义了一个类:
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)
因为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智能指针)来管理动态内存.