【发布时间】:2017-01-31 15:18:38
【问题描述】:
首先,我很长时间没有使用 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;
}
【问题讨论】:
-
您正在尝试
delete静态分配的字符串(所有字符串文字都是静态分配的)。首选 std::string 并删除您的析构函数(std::string 使用 RAII 并将自动处理其资源)。 -
您的代码归结为
delete[] "Hi";。您正在尝试delete一个未使用new分配的指针。您还泄漏了以前的分配。 -
@Kevin 另外,值得一提的是
new char[3]成功泄露。 -
请不要显示虚构版本的代码,实际版本是唯一需要的。
-
C++ 中没有关键字
Class。在 C++ 标准库中也没有函数strcpy_s。
标签: c++ memory-leaks