Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

delete[] 與 delete ?

0 views
Skip to first unread message

What's up ^_^

unread,
Nov 5, 1998, 3:00:00 AM11/5/98
to
最近發現一件事...
如果我有個 class A {}
然後我用 A* pa=new A[30]; 後面很明顯我要用 delete[] pa 來刪除
可是當我今天是 char *s=new char[30];
後面我應該寫成 delete[] s 或 delete s?
我發現好像我都寫成 delete s 了 (大概因為以前 free(char*)很常用吧)
可是好像編譯器 -Wall 也沒有 warning 出來,...
ㄟ 這樣有什麼危險嗎?

--
BCDFGIJKLNOPQRUVWXZ

--
Origin: [1;36m<洗屁屁小站> [1;32mcpp.m7.ntu.edu.tw [1;33m(140.112.250.100)
Welcome to CPP BBS [1;36m-- [1;31mFrom : [mpiaip [1;31m[ [m [1;31m] [m
--
[1;31mOrigin: [m [1;32m洗屁屁小站 [m [1;35mcpp.m7.ntu.edu.tw [1;33m140.112.250.100 [m
[1;33m洗屁屁小站的錢幣叫作屁屁, [1;36m所以來本站洗錢叫作洗屁屁。 [m

努力奮發

unread,
Nov 5, 1998, 3:00:00 AM11/5/98
to
※ 引述《piai...@cpp.m7.ntu.edu.tw (What's up ^_^)》之銘言:
: 最近發現一件事...

: 如果我有個 class A {}
: 然後我用 A* pa=new A[30]; 後面很明顯我要用 delete[] pa 來刪除
: 可是當我今天是 char *s=new char[30];
: 後面我應該寫成 delete[] s 或 delete s?
: 我發現好像我都寫成 delete s 了 (大概因為以前 free(char*)很常用吧)
: 可是好像編譯器 -Wall 也沒有 warning 出來,...
: ㄟ 這樣有什麼危險嗎?

如果該 class 有 dtor 的話, 只有第一個 element 的 dtor 會被執行到
--
mailto:ijl...@csie.nctu.edu.tw?subject="send pgp key" to get my pgp public key
key finger print : FA 38 7E 91 FA 22 FA F6 63 04 E3 B5 A1 9F 0C CD

不知道誰寫的 self-produce program...
char*p="char*p=%c%s%c;main(){printf(p,34,p,34);}";main(){printf(p,34,p,34);}

--
※ Origin: 克萊恩大地 ◆ From: Terry.Dorm10.NCTU.edu.tw
--

洗屁屁

unread,
Nov 5, 1998, 3:00:00 AM11/5/98
to
※ 引述《piaip (What's up ^_^)》之銘言:

: 後面我應該寫成 delete[] s 或 delete s?
: 我發現好像我都寫成 delete s 了 (大概因為以前 free(char*)很常用吧)
: 可是好像編譯器 -Wall 也沒有 warning 出來,...
: ㄟ 這樣有什麼危險嗎?

只是不能把整個 new 出來的陣列歸還而已

所以delete是合法的,當然不是啥 warning 啊!

--
Origin: [1;36m<洗屁屁小站> [1;32mcpp.m7.ntu.edu.tw [1;33m(140.112.250.100)

Welcome to CPP BBS [1;36m-- [1;31mFrom : [mFrank [1;31m[ [mfrank.m7.ntu.edu.tw [1;31m] [m

四眼的王蟲

unread,
Nov 17, 1998, 3:00:00 AM11/17/98
to
On 05 Nov 1998 03:15:44 GMT, piai...@cpp.m7.ntu.edu.tw (What's up
^_^) wrote:

>最近發現一件事...
>如果我有個 class A {}
>然後我用 A* pa=new A[30]; 後面很明顯我要用 delete[] pa 來刪除
>可是當我今天是 char *s=new char[30];

>後面我應該寫成 delete[] s 或 delete s?
>我發現好像我都寫成 delete s 了 (大概因為以前 free(char*)很常用吧)
>可是好像編譯器 -Wall 也沒有 warning 出來,...
>ㄟ 這樣有什麼危險嗎?

依照 C++ Standard 的規定, 這樣的行為是 undefined,
程式這樣寫可能沒有任何問題發生但也可能會有奇怪
的問題出現, 依你使用的 compiler 而定.

四眼的王蟲

努力奮發

unread,
Nov 17, 1998, 3:00:00 AM11/17/98
to
※ 引述《iamck...@csie.nctu.edu.tw (tiger)》之銘言:
: ==> 在 TerryL...@Terry.Dorm10.NCTU.edu.tw (努力奮發) 的文章中提到:
: : ※ 引述《piai...@cpp.m7.ntu.edu.tw (What's up ^_^)》之銘言:
: : : 最近發現一件事...

: : : 如果我有個 class A {}
: : : 然後我用 A* pa=new A[30]; 後面很明顯我要用 delete[] pa 來刪除
: : : 可是當我今天是 char *s=new char[30];
: : : 後面我應該寫成 delete[] s 或 delete s?
: : : 我發現好像我都寫成 delete s 了 (大概因為以前 free(char*)很常用吧)
: : : 可是好像編譯器 -Wall 也沒有 warning 出來,...
: : : ㄟ 這樣有什麼危險嗎?
: : 如果該 class 有 dtor 的話, 只有第一個 element 的 dtor 會被執行到
: ~~~~這是解構子的意思吧??
: 照您這麼說那char *c = new char[100];
: 再delete c;也不能把它記憶體完全釋放否??

會完全釋放
沒有執行 dtor 可能會遇到的問題是,
假設您在 ctor 或其他 function 中 new 記憶體, 在 dtor 中釋放記憶體
如果您用的是 delete , 則只會執行第一個 element 的 dtor
則只有第一個 element 所 new 的記憶體會被釋放, 其餘 element 會造成 memory leak
如果您用的是 delete[], 則會執行所有 element 的 dtor

--
mailto:ijl...@dragon2.net?subject="send pgp key" to get my pgp public key

Jiun-Yao Huang

unread,
Nov 17, 1998, 3:00:00 AM11/17/98
to
<< 努力奮發 (TerryL...@Terry.Dorm10.NCTU.edu.tw) >> wrote:
// 會完全釋放
// 沒有執行 dtor 可能會遇到的問題是,
// 如果您用的是 delete , 則只會執行第一個 element 的 dtor

不一定,不同的 compiler 可能會有不同的作法。
這一點在 C++ Standard 是 undefined。

--
Jiun-Yao Huang <mailto:jyh...@csie.nctu.edu.tw> Uni\/\/indows
Dep. of Comp. Sci. & Info. Eng., NCTU, Hsin-Chu, Taiwan, R.O.C. WW\/\/etworks
- - - - - - - - - - - - - - - - - - - - <http://www.csie.nctu.edu.tw/~jyhuang>
class JiunYaoHuang : public Hacker, protected Artist, private Vocalist {};

0 new messages