[問題] operator new in gcc452

看板C_and_CPP (C/C++)作者 (老王)時間13年前 (2013/01/15 20:59), 編輯推噓6(6015)
留言21則, 4人參與, 最新討論串1/1
先看範例程式及在LINUXAMD64下執行結果: 1 #include <cstdio> 2 #include <cstdlib> 3 4 class A 5 { 6 public: 7 A() 8 { 9 printf("A()=>%d\n", test); 10 } 11 12 void* operator new(size_t, int) 13 { 14 printf("A::operator new\n"); 15 A *a = (A*)malloc(sizeof(A)); 16 a->test = 100; 17 return a; 18 } 19 20 void operator delete(void* p) 21 { 22 free(p); 23 } 24 25 int test; 26 }; 27 28 class B : public A 29 { 30 public: 31 #if 0 32 B() 33 { 34 printf("B()=>%d\n", test); 35 } 36 #endif 37 38 private: 39 int test2; 40 }; 41 42 int main() 43 { 44 A a1; 45 printf("A1:test=%d\n\n", a1.test); 46 47 A *a2 = new (0) A(); 48 printf("A2:test=%d\n\n", a2->test); 49 50 B b1; 51 printf("B1:test=%d\n\n", b1.test); 52 53 B *b2 = new (0) B(); 54 printf("B2::test=%d\n\n", b2->test); 55 56 return 0; 57 } Result: A()=>-246330304 A1:test=-246330304 A::operator new A()=>100 A2:test=100 A()=>-1787534240 B1:test=-1787534240 A::operator new A()=>0 B2::test=0 ======================================== 主要有兩個問題: 1. 前三個值都很合理,但是第四個值為什麼是0呢? 2. 如果我把B的constructor那一段註解拿掉,那第四個值就會變成100。 謝謝。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.128.66.129

01/15 21:54, , 1F
你可以拿 new 裡面 malloc 得到的 address 和 b2 比看看
01/15 21:54, 1F

01/15 21:55, , 2F
另外一點就是 malloc 的大小應該用 new 的第一個參數才對
01/15 21:55, 2F

01/15 22:05, , 3F
malloc拿到的位址和b2一樣。我把malloc的size改成第一個參
01/15 22:05, 3F

01/15 22:05, , 4F
數,但是第四個值還是0。
01/15 22:05, 4F

01/15 22:07, , 5F
比較奇怪的是,如果用gcc412,那第四個值會是100。
01/15 22:07, 5F

01/15 22:25, , 6F
為什麼 new(0) 掛號裡面要寫零阿 掛號內不是代表以分配的位
01/15 22:25, 6F

01/15 22:25, , 7F
址嗎??
01/15 22:25, 7F

01/15 22:27, , 8F
因為這是 operator overloading
01/15 22:27, 8F

01/15 22:30, , 9F
可以去找看看你用的 compiler 是不是已經有人回報 bug
01/15 22:30, 9F

01/16 06:49, , 10F
這好像是 undefined behavior
01/16 06:49, 10F

01/16 06:51, , 11F
因為你這是non-POD type 作static_cast http://tinyurl
01/16 06:51, 11F

01/16 06:51, , 12F
01/16 06:51, 12F

01/16 07:03, , 13F
mprotect 在 改完 test 值 作write 保護 在B沒
01/16 07:03, 13F

01/16 07:04, , 14F
constructor下會發生seg fault 有加 則不會發生
01/16 07:04, 14F

01/16 07:05, , 15F
我猜 是因為B沒constructor下 會讓gcc自動把 所有
01/16 07:05, 15F

01/16 07:07, , 16F
B的 member清成0
01/16 07:07, 16F

01/16 07:14, , 17F
你把A constructor 拿掉 你第3個也不會顯示 100
01/16 07:14, 17F

01/16 07:15, , 18F
2
01/16 07:15, 18F

01/16 09:10, , 19F
B 如果是 POD type,用 new B() 會初始化,new B 則不會
01/16 09:10, 19F

01/16 09:13, , 20F
不過這裡是 POD type 繼承 non-POD type 的情況。
01/16 09:13, 20F

01/16 12:42, , 21F
感謝各位的回答
01/16 12:42, 21F
文章代碼(AID): #1GzLB3lb (C_and_CPP)
文章代碼(AID): #1GzLB3lb (C_and_CPP)