如何正确地分配内存?

问题描述 投票:-1回答:1

班级:

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; delete []个项目;}

我收到这些错误:

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

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

c++ memory dynamic-memory-allocation
1个回答
2
投票

如何正确地释放内存?

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


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

  • 除了只负责管理该内存的类以外,不要管理任何其他类的内存。
  • 对于每个新文件,总是只有一个删除项。永远不要删除任何内容。
  • 仅将delete用于new,将delete[]用于new[]。>
  • 不要删除任何新的未返回的内容。
  • 总是在每个构造函数中初始化拥有的指针。
  • 不要让拥有的指针指向有效对象或nullptr以外的任何东西作为类不变式。
  • 永远不要让拥有的指针与另一个对象具有相同的值作为类不变式。
  • 除非已将其删除,否则请不要分配给拥有的指针。
  • 除非立即为它分配一个有效值(除非在析构函数中只需要删除),否则不要删除拥有的指针。
  • 不要在分配指针的类中的任何地方删除指针。
  • 实施所有五个析构函数,复制/移动构造函数/分配。

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

通过创建mcve开始。

© www.soinside.com 2019 - 2024. All rights reserved.