2012-09-13 26 views
0

我有一個wxMenuBar和一個wxMenu。我可以用Append(...)成功地將菜單附加到菜單欄。我也可以使用刪除(...)成功刪除菜單。重新附加/刪除wxMenuBar +內存問題wxMenu

「menu」示例演示如何添加和刪除菜單:它創建一個菜單,Append-s it,然後刪除它,調用返回指針的delete。要添加另一個,它會創建一個全新的菜單。因此沒有任何重新附着。

但是,我希望能夠追加,刪除,並重新追加任何特定的菜單(或允許的東西等效)。此外,它必須沒有內存泄漏。


我曾嘗試:

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

產生一個工作程序沒有內存泄漏。奇怪的是,我發現menubar-> Remove返回的指針與最初的Append-ed指針不同。

我想:

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

這appbase.cpp產生一個斷言錯誤:1015,東西長約附加菜單兩次。

我真的不知道我在做什麼,如果有人會解釋「正確」的方式來做到這一點,我將不勝感激。

回答

1

我不明白Remove()返回的菜單如何與您附加的不同。也許你的菜單不在1號位置?無論如何,規則很簡單:菜單欄取得了附加到(或插入)菜單的所有權,這意味着它將刪除它們。當您從菜單欄中刪除菜單時,它會放棄所有權,現在您有責任刪除它。

因此,您可以刪除菜單並稍後再添加它。但是你不能兩次添加相同的菜單。

+0

我是刪除的位置,而不是索引(指數=位置 - 1)。將我的代碼更改爲在索引而不是位置上刪除可以修復問題。即,刪除(1)不起作用,但刪除(0)會起作用,如果有一個菜單。你能證實這是正確的嗎? – imallett

+0

索引和位置是同義詞,都從0開始。 –

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); 

這是處理顯示彈出式上下文菜單時的東西是右單擊,只是不用在窗口彈出菜單的標準方式,附加到菜單欄。

+0

我應該提到 - 我嘗試了這種方法,但失敗了。刪除需要是一個索引,顯然? – imallett

+0

它是如何失敗?你的代碼是什麼樣的? – ravenspoint