内存泄漏和崩溃与删除[]
Memory leak and crash with delete[]
我有一个内存泄漏的程序,每次我向代码添加删除时,它都会崩溃。我只是想知道是否有人知道为什么会发生这种情况。崩溃的代码如下。这是删除的破坏者名字和姓氏声明如下。
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块,但使用字符串类要容易得多:如果构造函数抛出异常,任何完全构造的子对象都会被自动销毁。这样,字符串的构造函数就会处理内存。
假设firstName
和lastName
是Name
类的正确元素,你应该注意strlen不会检查NULL,所以你应该处理NULL
Name::Name(const Name& name){
if (name.firstName) {
int len_z = strlen(name.firstName)+1;
firstName = new char [len_z];
strncpy(firstName, name.firstName, len_z);
// ^^^ also copy the terminator char ^^^
} else {
firstName = NULL;
}
// repeat for lastName:
if (name.lastName) {
int len_z = strlen(name.lastName)+1;
lastName = new char [len_z];
strncpy(lastName, name.lastName, len_z);
} else {
lastName = NULL;
}
}
或者使用如下所示的构造函数创建标准Name
对象:
Name::Name() {
firstName = new char[1];
firstName[0] = ' ';
// repeat for lastName:
lastName = new char[1];
lastName[0] = ' ';
}
至少在这里你明白了,为什么std::string
是一个更好的选择:它是一个实现你需要的字符串所有方面的类。如果你手工制作,你必须把名字和姓氏加倍......想象一下,您的Name
类的下一个版本中很快就会有middleName
......
- 在虚幻引擎中删除NXOpen对象时崩溃
- 无法删除EXE崩溃后,即使进程未显示在任务管理器中
- 删除SDL_PollEvent时程序崩溃
- 删除数组 c++ 崩溃问题
- 在C++中删除指针数组时析构函数崩溃
- 使用自定义上下文菜单删除 QTreeView 项崩溃
- 如果我从single_digits[*num - '0']]中删除'0',为什么这个程序会崩溃)
- 删除动态字符串时程序崩溃
- 当删除上下文属性中的QLIST对象时,QT QML应用程序崩溃
- 删除关键字导致程序崩溃
- C++将自删除推回矢量时崩溃
- 为什么要删除指针崩溃wchar_t?
- 试图删除最后一个std ::向量元素时,程序会崩溃
- 当我尝试删除指针时,我的程序崩溃
- 当我递增指针然后将其删除时,为什么我的程序会崩溃
- qquickvew删除导致应用程序崩溃
- C++:指向对象的指针数组 - 删除元素时程序崩溃>
- c 从范围删除对象的操作员导致崩溃dealloceLoceLoceLoceLoceLoceLoceLoceLoceL
- 在阵列上删除崩溃C++
- C++删除[]崩溃