班级:
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的校验和不正确:释放后可能已修改。
也许我正在尝试重复删除某些内容,但找不到什么内容和位置
如何正确地释放内存?
通过使用RAII容器(例如std::string
管理分配)。>
如果需要执行手动内存管理,请遵循以下规则:
delete
用于new
,将delete[]
用于new[]
。>也许我正在尝试重复删除某些内容,但找不到什么内容和位置
通过创建mcve开始。