【问题标题】:char array initialization and destructorchar 数组初始化和析构函数
【发布时间】: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


【解决方案1】:

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

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

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

解决办法是去掉引用的行。

【讨论】:

    猜你喜欢
    • 2012-10-23
    • 2012-05-12
    • 2013-09-12
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 2020-10-04
    • 2023-04-10
    相关资源
    最近更新 更多