在wxMenuBar +内存问题上重新连接/删除wxMenu

时间:2012-09-13 03:22:46

标签: wxwidgets

我有一个wxMenuBar和一个wxMenu。我可以使用Append(...)将菜单成功附加到菜单栏。我也可以使用Remove(...)成功删除菜单。

“menu”示例演示添加和删除菜单:它创建一个菜单,Append-s it,然后Remove-s it,在返回的指针上调用delete。要添加另一个,它会创建一个全新的菜单。因此,没有任何重新连接。

但是,我希望能够追加,删除和重新附加任何特定的菜单(或允许它的等效菜单)。此外,它必须没有内存泄漏。


我试过了:

//startup
menubar->Append(menu,title);
//later
delete menubar->Remove(1);

这产生了一个没有内存泄漏的工作程序。奇怪的是,我发现menubar-> Remove返回的指针与最初追加的指针不同。

我试过了:

//startup
menubar->Append(menu,title);
//later
delete menubar->Remove(1);
menubar->Append(menu,title); //add it back immediately after removing it.

这会在appbase.cpp中产生一个断言错误:1015,这是关于附加菜单两次的。

我真的不知道我在做什么,如果有人能解释“正确”的方式,我将不胜感激。

2 个答案:

答案 0 :(得分:1)

我不明白Remove()返回的菜单如何与您附加的菜单不同。也许你的菜单不在1号位置?

无论如何,规则很简单:菜单栏取得附加到(或插入)它的菜单的所有权,这意味着它将删除它们。当您从菜单栏中删除菜单时,它会放弃所有权,现在您负责删除它。

因此您可以删除菜单并稍后再将其添加回来。但是你不能两次添加相同的菜单。

答案 1 :(得分:1)

只要您不删除菜单并将其保存在某处,就应该没问题。

这样的事情:

//construct menu
// this needs to be saved somewhere, perhaps as an attribute of the app frame 
wxMenu * menu = new wxMenu( title );
....

// Attach menu to menubar
menubar->Append(menu,title);

....

// remove menu ( but don't delete! )
menubar->Remove(1);

....

// re-attach menu
Append(menu,title);

这是处理右键单击某些内容时显示的弹出上下文菜单的标准方法,不同之处在于它不会弹出窗口中的菜单,而是附加到菜单栏。