用迴圈產生的new,怎麼用delete全消除

喜歡程式設計嗎?想要一窺 KDE/Qt 程式設計的奧秘嗎?想要
學習 X Window 上的視窗程式設計嗎?歡迎各類關於 KDE/Qt、Qtopia、Qt/Embedded、QSA、PyQt 等各類心得討論。

版主: AceLan, Franklin

用迴圈產生的new,怎麼用delete全消除

文章訪客 » 週三 7月 08, 2009 12:28 pm

例如我用迴圈產生三個物件:
for(int i=1;i<=3;==i)
{
QLabel *a = new QLabel(this);
a->setText("123");
a->move(100*i,0);

}
這樣會有三個lebel出現
但是我用delete a 卻只會刪除掉第一個,其他的不能刪除。
請問我要怎麼樣才能3個全刪除勒?
訪客
 

文章企鵝狂 » 週三 7月 08, 2009 12:45 pm

你不能這樣吧, 重複 new東西給a , 先前的就不見了, 變成dangling pointer
http://news.bbc.co.uk/1/hi/world/asia-pacific/country_profiles/1285915.stm


Country profile: Taiwan
Map of Taiwan
Taiwan is the island which has for all practical purposes been independent for half a century, but which China regards as a rebel region that must be reunited with the mainland - by force if necessary.
企鵝狂
活潑的高中生
活潑的高中生
 
文章: 477
註冊時間: 週三 3月 31, 2004 11:13 am
來自: 台灣共和國

Re: 用迴圈產生的new,怎麼用delete全消除

文章訪客 » 週三 7月 08, 2009 2:37 pm

Anonymous 寫:例如我用迴圈產生三個物件:
for(int i=1;i<=3;==i)
{
QLabel *a = new QLabel(this);
a->setText("123");
a->move(100*i,0);

}
這樣會有三個lebel出現
但是我用delete a 卻只會刪除掉第一個,其他的不能刪除。
請問我要怎麼樣才能3個全刪除勒?


應該使用QList,把QLable加到list中
自己試看看
http://doc.trolltech.com/4.5/qlist.html
訪客
 

文章訪客 » 週三 7月 08, 2009 7:17 pm

我用大陸網友的方法解決了,大家順便瞧瞧:
http://www.qtcn.org/bbs/read.php?tid=19939&page=e&#a
訪客
 

文章legnaleurc » 週三 7月 08, 2009 8:10 pm

有繼承 QWidget 的物件,都會透過 parent 自動刪除吧
legnaleurc
可愛的小學生
可愛的小學生
 
文章: 62
註冊時間: 週四 6月 21, 2007 10:36 am

文章訪客 » 週三 7月 08, 2009 8:37 pm

Anonymous 寫:我用大陸網友的方法解決了,大家順便瞧瞧:
http://www.qtcn.org/bbs/read.php?tid=19939&page=e&#a

用QList也可以窩

也可以用QList,和QVector用法一樣,他是一種增長式矩陣,早期的程式矩陣宣告多大就多大,超過長度就會ERROR,近期發展的語言都有累事功能,java也有,你現在這個長度是3,當然可在加上去或減少,彈性很大

QList<QLabel*> list1;
for(int i=1;i<=3;++i)
{
QLabel* a = new QLabel(this);
list1<<a;
a->setText("123");
a->move(100*i,0);

}
訪客
 

文章訪客 » 週三 7月 08, 2009 8:42 pm

SORRY
list1<<a;
應擺在最後面
訪客
 

文章訪客 » 週三 7月 08, 2009 8:47 pm

legnaleurc 寫:有繼承 QWidget 的物件,都會透過 parent 自動刪除吧

那樣寫只是後面物件會蓋掉前面的物件(因為都叫a)
辦法就是產生一個物件就放到矩陣(QVector或QList),要用在從矩陣拿出來用
訪客
 

文章訪客 » 週三 7月 08, 2009 8:52 pm

還有那樣寫a只在迴圈看得到,迴圈以外便看不到變數,要注意是區域或全域變數,public或private,在debug常常會出錯窩
訪客
 

文章yy2010 » 週四 10月 29, 2009 10:47 pm

我用的方法
在 for 迴圈裡面

a->setObjectName("MyLabel_"+i);


然後在程式任一個地方只要用

QList<QLabel *> *tmpLabelsList = this->findChildren<QLabel *>(QRegExp("^MyLabel_"));

這樣你的那些 Labels 就被存到 tmpLabelsList 了 要殺要剮隨你了
這樣好處是不需要全域變數
yy2010
可愛的小學生
可愛的小學生
 
文章: 8
註冊時間: 週四 10月 29, 2009 10:15 pm


回到 KDE/Qt 程式設計

誰在線上

正在瀏覽這個版面的使用者:沒有註冊會員 和 1 位訪客