【发布时间】:2020-06-23 00:42:41
【问题描述】:
类:
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 的校验和不正确:可能在释放后修改。
也许我正在尝试双重删除某些内容,但找不到内容和位置
【问题讨论】:
-
使用
std::string代替char指针和手动内存管理;所有这些问题都会消失 -
我不允许使用
std::string -
在这种情况下,创建你自己的类,就像 std::string 一样(无论如何你都必须做同样的工作,并且在你自己的类中进行测试要容易得多,而不是把它和菜单类代码混在一起)
-
假设您使用的是 Linux 机器,您是否尝试过使用
valgrind或使用地址清理来编译您的代码?
标签: c++ memory dynamic-memory-allocation