[問題] operator new在 class 的問題

看板C_and_CPP作者 (小那)時間15年前 (2010/06/05 02:11), 編輯推噓12(12062)
留言74則, 8人參與, 最新討論串1/1
遇到的問題: (題意請描述清楚) 我想要印出5 卻印出一個-3346656679 看起來是亂碼 希望得到的正確結果: 5 程式跑出來的錯誤結果: 亂碼 開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux) Dev-C++, Windows 有問題的code: (請善用置底文標色功能) #include <iostream> using namespace std; class Hello { public: Hello(); ~Hello(); void show(); private: int *firstname; }; Hello::Hello() { int *firstname= new int(5); } Hello::~Hello() { delete firstname; } void Hello::show() { cout<<*firstname; } int main () { Hello a; a.show(); system("PAUSE"); return 0; } 補充說明: 嗚嗚~~為什麼我印不出5??? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.20.136.164

06/05 02:12, , 1F
ctor裡面不用int* 寫firstname = new int(5);就好了
06/05 02:12, 1F

06/05 02:16, , 2F
沒new到 你leak了
06/05 02:16, 2F

06/05 02:20, , 3F
謝謝!!可以了@@
06/05 02:20, 3F

06/05 02:22, , 4F
不過,好怪喔,為什麼又不用加 int * ???
06/05 02:22, 4F

06/05 02:23, , 5F
你這樣寫 變成local又定義了一個 跟class原本有的不同一個阿
06/05 02:23, 5F

06/05 02:24, , 6F
跑完constructor就leak了
06/05 02:24, 6F

06/05 02:24, , 7F
你是在 ctor 裡再宣告一個區域變數遮掉成員變數
06/05 02:24, 7F

06/05 02:25, , 8F
我個人只要是成員存取都會用 this-> 來標明 ...
06/05 02:25, 8F

06/05 02:25, , 9F
雖然整個 code 看起來很囉嗦 orz
06/05 02:25, 9F

06/05 02:26, , 10F
不過 this 可以幫助區分區域變數與成員變數 會較易讀 XD
06/05 02:26, 10F

06/05 02:27, , 11F
喔...我懂了~~謝謝Q大
06/05 02:27, 11F

06/05 02:32, , 12F
謝謝大家的指教,我這是故意要用 new poerator 試試看低
06/05 02:32, 12F

06/05 03:31, , 13F
區域變數我是直接在後面補一個底線來命名。
06/05 03:31, 13F

06/05 03:50, , 14F
趁現在問一個問題,在函式裡用extern可以把裡面的local
06/05 03:50, 14F

06/05 03:51, , 15F
(打錯,不是local是參數)或成員變數用global遮掉,可是
06/05 03:51, 15F

06/05 03:52, , 16F
local卻不行,有人知道是為什麼嗎?
06/05 03:52, 16F

06/05 06:55, , 17F
因為 local 是 auto variable,跟 extern 相衝,
06/05 06:55, 17F

06/05 06:55, , 18F
連編都編不過。而且何必自討苦吃,你可以用 ::var 直接
06/05 06:55, 18F

06/05 06:56, , 19F
指定用 global 的,甚至是用 using ::v 這種東西。
06/05 06:56, 19F

06/05 10:38, , 20F
t大每次推文都有看不懂得字眼...t大你有不會的東西嗎...
06/05 10:38, 20F

06/05 11:38, , 21F
我只會 1% 別人不會的東西,別人會的 99% 我都不會。
06/05 11:38, 21F

06/05 11:43, , 22F
那parameter應該算哪種variable?因為它能遮掉
06/05 11:43, 22F

06/05 11:51, , 23F
parameter 算 auto variable。但是它的 scope 跟 local
06/05 11:51, 23F

06/05 11:51, , 24F
有個微妙的差距。因為它算在 function body 的那對大括號
06/05 11:51, 24F

06/05 11:51, , 25F
的 block 之外,所以不會衝突。
06/05 11:51, 25F

06/05 11:54, , 26F
所以一樣的道理,你真的想硬蓋,可以再開一層 block,
06/05 11:54, 26F

06/05 11:54, , 27F
裡面放 extern,這樣那個 block 內就是抓 global。
06/05 11:54, 27F

06/05 11:56, , 28F
你的問題主要是,在同一個 scope 下,對同一個 identifier
06/05 11:56, 28F

06/05 11:57, , 29F
標了不同的 storage class specifier,導致宣告衝突。
06/05 11:57, 29F

06/05 11:58, , 30F
有一點搞不清,parameter能被extern遮,卻不能被local
06/05 11:58, 30F

06/05 11:59, , 31F
遮,compiler會跳出錯誤
06/05 11:59, 31F

06/05 11:59, , 32F
你編不過的問題不叫不能遮掉,叫做宣告衝突,這比判斷
06/05 11:59, 32F

06/05 12:00, , 33F
能不能遮掉更早而且更基本。
06/05 12:00, 33F

06/05 12:03, , 34F
{ auto int v = 10; extern int v; } <-- auto 衝 extern
06/05 12:03, 34F

06/05 12:05, , 35F
parameter 算在 { } 的外面,每開一個 { } 本來就能宣告
06/05 12:05, 35F

06/05 12:05, , 36F
或定義重複的 identifier,所以合法。
06/05 12:05, 36F

06/05 12:06, , 37F
譬如 { int v; while(1) { double v; } }
06/05 12:06, 37F

06/05 12:07, , 38F
所以 { int v; { extern int v; cout << v << endl; } }
06/05 12:07, 38F

06/05 12:07, , 39F
這樣硬開 block 的話,最內層看到的就是 global 了。
06/05 12:07, 39F

06/05 12:10, , 40F
這個差異看早期 K&R C 的 parameter 宣告法會更明顯。
06/05 12:10, 40F

06/05 12:13, , 41F
void foo(v) int v; { extern int v; }
06/05 12:13, 41F

06/05 12:14, , 42F
裡面不另加{},那parameter後面只能宣告不能重新定義?
06/05 12:14, 42F

06/05 12:16, , 43F
「parameter 後面」是指什麼地方?
06/05 12:16, 43F

06/05 12:17, , 44F
另外,while似乎跟for/if/catch有差異,()裡面不能跟{}
06/05 12:17, 44F

06/05 12:18, , 45F
裡有同名的東西,後者則可以
06/05 12:18, 45F

06/05 12:18, , 46F
parameter 先天上就被一個天然的 { } 隔開一層 scope 了。
06/05 12:18, 46F

06/05 12:19, , 47F
函式的{}裡,可以用extern,不能用local
06/05 12:19, 47F

06/05 12:23, , 48F
while/for/if 這些東西的 () 裡面是 C99 特准你定義新的
06/05 12:23, 48F

06/05 12:23, , 49F
變數在運算式上,有效範圍算在 { } 內,那個 () 裡放的
06/05 12:23, 49F

06/05 12:24, , 50F
東西基本上還是叫運算式,跟 function 宣告式 () 裡面放的
06/05 12:24, 50F

06/05 12:24, , 51F
參數列雖然語法很像,卻是完全不同的元素。
06/05 12:24, 51F

06/05 12:26, , 52F
你在同一層 { } 之所以不能又 auto 又 extern,是因為型別
06/05 12:26, 52F

06/05 12:27, , 53F
修飾字衝到。就像你同時寫了 extern int v; 下一行又緊接
06/05 12:27, 53F

06/05 12:27, , 54F
了 extern double v; 這樣。
06/05 12:27, 54F

06/05 12:28, , 55F
這邊遇到的是 int 衝 double,而你前面遇到的是
06/05 12:28, 55F

06/05 12:28, , 56F
auto 衝 extern。
06/05 12:28, 56F

06/05 12:28, , 57F
我沒說那是參數列啊,只是好奇while的性質怎麼跟人不同
06/05 12:28, 57F

06/05 12:30, , 58F
只有它不能在{}用extern或auto宣告同名變數
06/05 12:30, 58F

06/05 12:34, , 59F
雖然我很想直接回說這是規定,但你想理解原因的話也不難。
06/05 12:34, 59F

06/05 12:35, , 60F
假設你寫了 while(int v = 5) { ... },
06/05 12:35, 60F

06/05 12:36, , 61F
如果允許你在 { } 裡面遮掉 v,你要怎樣修改被遮掉的 v,
06/05 12:36, 61F

06/05 12:36, , 62F
使得 loop 可以結束?雖然你的確能在 { } 內使用 break
06/05 12:36, 62F

06/05 12:37, , 63F
中斷這個 loop,但與其這樣你不如乾脆寫 while(1) 或
06/05 12:37, 63F

06/05 12:37, , 64F
while(true)。
06/05 12:37, 64F

06/05 12:40, , 65F
if() 不是 loop 結構,不能改沒差。for 就算被遮掉,
06/05 12:40, 65F

06/05 12:40, , 66F
還有一個專用的位置可以修改引導 loop 的變數。
06/05 12:40, 66F

06/05 12:40, , 67F
while 就沒有了。
06/05 12:40, 67F

06/05 12:41, , 68F
if 後面我多打了一對 (),無視它就好,慣例上不該這樣寫。
06/05 12:41, 68F

06/05 12:44, , 69F
慣例上不該這樣寫的意思是if()裡不適合定義新變數?
06/05 12:44, 69F

06/05 12:45, , 70F
不,慣例是指討論程式的慣例,寫 xxx() 一般代表 xxx 是
06/05 12:45, 70F

06/05 12:46, , 71F
一個函式,所以我 12:40 第一行第三第四個字母應該去掉。
06/05 12:46, 71F

06/05 12:46, , 72F
應該是第三第四個字元...
06/05 12:46, 72F

06/05 13:00, , 73F
感謝樓上的回答
06/05 13:00, 73F

06/05 13:45, , 74F
推文我認為蠻有價值的,收錄起來~
06/05 13:45, 74F
文章代碼(AID): #1C2K7PbD (C_and_CPP)