繁体   English   中英

如何正确释放内存?

[英]How to properly deallocate memory?

课程:

class Menuitem
{
private:
    char* text;

    Menuitem();
    Menuitem(const char*);
    ~Menuitem();
    Menuitem(const Menuitem& ) = delete;
    Menuitem& operator=(const Menuitem& ) = delete;
    friend class Menu;
public:
};

class Menu
{
private:
    char* title;
    Menuitem* items;
    int identation = 0;
    int amount = 0;
public:
    Menu();
    Menu(const char*, int = 0);
    ~Menu();
    bool isEmpty() const;
    int run() const;
    void add(const char*);
    void display() const;
    Menu& operator=(const char* nTitle);
    operator int() const;
    Menu& operator=(const Menu& );
    operator bool() const;
    Menu& operator<<(const char* );
};

职能:

Menu& Menu::operator=(const char* nTitle)
{
    if (nTitle[0] != '\0' && title[0] != '\0')
    {
        delete[] title;
        title = new char[strlen(nTitle)+1];
        strcpy(title, nTitle);
    }
    else if (title[0] != '\0' && nTitle == 0)
    {
        delete[] title;
        title = nullptr;
    }
    else
    {
        title = nullptr;
    }
    return *this;
}

Menu& Menu::operator=(const Menu& nMenu)
{
    if (nMenu.title[0] != '\0' && title[0] != '\0')
    {
        delete[] title;
        title = new char[strlen(nMenu.title)+1];
        strcpy(title, nMenu.title);
    }
    else if (nMenu.title[0] == '\0' && title[0] != '\0')
    {
        delete[] title;
        title = nullptr;
    }
    else
    {
        title = nullptr;
    }


    if (!amount)
        for (int i = 0; i < amount; i++)
        {
            if (items[i].text[0] != '\0')
            {
                delete[] items[i].text;
                items[i].text = nullptr;
            }
        }
    amount = 0;

    for (int i = 0; i < nMenu.amount; i++)
    {
        if (nMenu.items[i].text != nullptr)
        {
            items[i].text = new char[strlen(nMenu.items[i].text)+1];
            strcpy(items[i].text, nMenu.items[i].text);
        }
        else
        {
            items[i].text = nullptr;
        }
    }
    amount = nMenu.amount;
    identation = nMenu.identation;
    return *this;
}

我的代码有很多功能,但我认为这些(或其中之一)功能会导致错误。 代码显示了我需要的内容,但最后当我使用析构函数从 Menu 中清除指针时

Menu::~Menu(){delete[] title; 删除[]项;}

我收到这些错误:

malloc:已释放对象 0x102832838 的校验和不正确:可能在被释放后被修改。

也许我正在尝试双重删除某些内容,但我找不到内容和位置

如何正确释放内存?

通过使用 RAII 容器(例如std::string管理分配。


如果您需要进行手动内存管理,请遵循以下规则:

  • 永远不要管理任何类中的内存,除非其唯一职责是管理该内存。
  • 对于每个新的,始终只有一个删除。 切勿多次删除任何内容。
  • 仅对new使用deletenew delete[]使用delete new[]
  • 切勿删除 new 未返回的任何内容。
  • 始终在每个构造函数中初始化拥有指针。
  • 永远不要让拥有指针指向除有效对象或 nullptr 以外的任何对象作为类不变量。
  • 永远不要让拥有指针与另一个对象具有相同的值作为类不变量。
  • 除非您刚刚删除它,否则永远不要分配给拥有的指针。
  • 除非您立即为其分配一个有效值(除非在析构函数中,您只需要删除),否则永远不要删除拥有指针。
  • 永远不要在任何地方删除指针,除非在你分配它的类中。
  • 实现所有五个析构函数,复制/移动构造函数/赋值。

也许我正在尝试双重删除某些内容,但我找不到内容和位置

首先创建一个mcve

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM