【发布时间】:2021-07-16 05:26:32
【问题描述】:
我正在尝试使用析构函数释放对象的内存。该内存是在对象声明时分配的。下面的代码 sn-p 是我正在制作的程序的综合版本,但它解释了我的问题。 我知道问题是通过析构函数释放的,但我不知道可能导致异常的原因。
#include <iostream>
using namespace std;
class student
{
private:
char const* firstname;
char const* lastname;
public:
student()
{
firstname = new char[10];
lastname = new char[10];
firstname = "HelloMaria";
lastname = "Something";
}
void print()
{
cout << "Firstname = " << firstname<<endl;
cout << "Last name = " << lastname << endl;
}
~student()
{
cout << "Destructor Called" << endl;
delete[] firstname;
delete[] lastname;
}
};
int main()
{
student obj1;
obj1.print();
system("pause");
return 0;
}
【问题讨论】:
-
真正的问题是什么?
-
请注意,在学生班级的默认构造函数中,lastname="Something" 我错误地将其写为“SomethingVe”,即使它是Something而不是SomethingVe,异常问题仍然存在。
-
firstname = "HelloMaria";将firstname更改为指向字符串文字而不是您分配的数组。您正在分配 char 数组,但随后会覆盖指向它们的指针……您会泄漏内存并且以后无法释放它们。此外,它们无论如何都不够大(您需要足够的空间来终止 null)。 -
firstname = new char[10];分配 10 字节的内存。firstname = "HelloMaria";覆盖该指针并泄漏您刚刚分配的内存。当析构函数被调用时,你尝试使用delete从未使用new分配的内存。使用strcpy将字符串复制到分配的内存中,并注意为所有字符分配足够的空间,并为终止的0 额外分配一个空间。对于“HelloMaria”,10 是不够的,它必须至少为 11。 -
@RetiredNinja 也必须更改指针。
strcpy不会喜欢char const*目标,显然 OP 将其推入其中以压制将文字地址保存给这些成员的警告。
标签: c++ c++11 visual-c++