簡體   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