[英]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
使用delete
對new
delete[]
使用delete
new[]
。也許我正在嘗試雙重刪除某些內容,但我找不到內容和位置
首先創建一個mcve 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.