我有一个程序存在内存泄漏,每次我将删除添加到我的代码时它都会崩溃。我只是想知道是否有人知道为什么会这样。崩溃的代码如下。 这是带有删除的析构函数 名字和姓氏声明如下。
char* firstName;
char* lastName;
Name::~Name(){
delete[] firstName;
delete[] lastName;
}
这里是分配内存的地方
Name::Name(Name& name){
//copys the first and last name from one Name to the other
firstName = new char [strlen(name.firstName)+1];
strcpy(firstName,name.firstName);
lastName = new char [strlen(name.lastName)+1];
strcpy(lastName,name.lastName);
}
最佳答案
很可能您在某个时候分配了一个Name
类型的对象并且没有复制分配(起初我以为没有复制构造函数但您实际上显示了您的复制构造函数)。默认生成的复制赋值只是按位复制。结果,您会在某个时候看到指针的双 delete[]
(也有内存泄漏,但这并不明显)。或者,您的其他构造函数是什么样的?是否有可能不初始化指针的默认构造函数或可能最终存储指向字符串文字的指针的构造函数?
最好的方法是不使用手动内存分配,而是使用std::string
。如果你不能使用 std::string
,例如,因为这是一个赋值,我强烈建议你实现你自己的简单字符串类:处理多个分配的实体,而不是将每个实体单独包装成一个合适的资源维护类非常困难。我不能正确地做到这一点。不可否认,大约 20 年来,我一直只使用 C++ 进行编程。
例如,您的复制构造函数不是异常安全的:如果您的第二次分配因没有足够的内存可分配而抛出异常,则资源泄漏。有一些方法可以处理函数级的 try/catch block ,但使用字符串类要容易得多:如果构造函数抛出异常,任何完全构造的子对象都会自动销毁。这样,字符串的构造函数负责内存。
关于c++ - 内存泄漏和 delete[] 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19883642/