首先,我很长时间没有使用C ++,这个问题可能非常简单,不值得发布。无论如何,我没有在这里或其他来源找到任何解决方案。
我的问题在于以下内容。我们假设我们有课A
:
Class A
{
char* string;
public:
char*& getString(){ return string; }
~A()
{
if (string)
delete[] string;
}
};
我无法修改此类(它只是真实类的一个示例)。
我想将字段string
设置为值:
int main()
{
A a;
a.getString() = new char[3];
a.getString() = "Hi\0";
return 0;
}
当调用析构函数~A()
时,此代码会导致调试断言失败。我在这里做错了什么?
我真的很感激任何关于我做错的建议。
编辑: 看来,这里的赋值运算符很重要。实际上,我正在做这样的任务:
int main()
{
A a;
char name[256];
std::cin.getline(name, 256);
a.getString() = new char[strlen(name)];
//actual version
strcpy_s(a.getString(), strlen(name), name);
//a.getString() = "Hi\0";
return 0;
}
答案 0 :(得分:1)
当调用析构函数~A()时,此代码会导致调试断言失败。我在这里做错了什么?
a.getString() = "Hi\0";
在此行之后,a.string
指向字符串文字。然后析构函数将在指针上调用delete[]
。删除字符串文字具有未定义的行为。此外,由于指针被覆盖,以前分配的动态数组也会泄露。
解决方法是删除引用的行。