[英]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.