char数组初始化和析构函数

时间:2017-01-31 15:18:38

标签: c++ memory-leaks

首先,我很长时间没有使用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;
}

1 个答案:

答案 0 :(得分:1)

  

当调用析构函数~A()时,此代码会导致调试断言失败。我在这里做错了什么?

a.getString() = "Hi\0";

在此行之后,a.string指向字符串文字。然后析构函数将在指针上调用delete[]。删除字符串文字具有未定义的行为。此外,由于指针被覆盖,以前分配的动态数组也会泄露。

解决方法是删除引用的行。