作者telgniw (Celia)
看板EE_DSnP
標題[討論] 關於上一堂課的newOp.cpp
時間Thu Nov 12 23:21:44 2009
老師有提到說如果把destructor去掉的話會出問題
可是我實際測試的結果是沒有影響耶
輸出來的記憶體位置和operator new與operator delete接到的size都沒有改變
剛剛翻了一下The C++ Programming Language也沒有找到
不過看到一個(可能)有點相關的東西:
如果類別長這樣:
class A {
public:
void *
operator new(size_t);
void operator delete(
void *, size_t);
};
class B:
public A {
public:
...
};
這樣以下的code:
A *ptr =
new B;
delete ptr;
在delete的時候編譯器會把A的大小塞給size_t,而不是給它B的大小
所以我們要在A裡面加上virual destructor:
virtual ~A() {}
因為釋放記憶體是由destructor負責(它知道物件的大小),而A(基底類別)有destructor
可以確保所有的衍生類別都有destructor(才能得到正確的大小)
// 其實上面這裡我沒有看很懂orz
這樣delete的時候才不會有問題
不過呢我實際測試的結果目前delete抓到的還是A的delete(也是A的大小)
但是如果在A::operator delete裡面有free傳進來的指標的話會出現segmentation fault
所以應該是在那之前(比方說~B()被呼叫時)就已經把記憶體釋放了
可是卻不是用我寫的B::operator delete釋放的
慢慢研究中...
PO出來看看有沒有人知道原因或者有什麼想法(或者不同系統跑出不一樣的結果之類的)
可以大家討論一下:D
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.45.181.158
1F:推 ric2k1:是我講錯了, 請見下面一篇說明! 11/12 23:53