C delete操作符是如何知道目標指標型別的?

時間 2021-05-11 20:36:25

1樓:李魔劍

型別是取不到的

如果要長度和行號什麼的按下面的寫法就可以了話說長度有必要去分析malloc那個頭麼,直接鉤了取傳入的引數不就得了...

void* operator new(size_t size, const char* file, int line)

#define new new(__FILE__, __LINE__)

2樓:咕咚咕咚

delete p會根據宣告的型別來呼叫析構函式,如果是使用子類的建構函式去賦值父類指標,必須通過虛析構函式來析構子類物件,否則只會呼叫基型別的析構函式,可能會出問題。

虛析構函式在子型別的虛函式表裡,然後依次呼叫父類的虛析構函式,p指標指向的記憶體空間會額外多乙個虛函式表的指標。

參考cousera課程c++程式設計第6周虛析構函式。

3樓:Code Hz

上面已經有答主說到是編譯期識別型別的了,但是其實編譯期能識別的型別有限制,比如涉及多型就不能識別了,這個所以你需要使用虛析構函式,這樣就可以在執行時決定具體呼叫哪些析構函式了。

釋放空間這個,與上面的無關,不過與虛函式原理類似,都是儲存了一部分的元資訊,這樣就可以在釋放空間時準確知道有多大了

補充:::operator new 和::operator delete並不是實際的new 和 delete的全部,而只是過程的一部分而已,它們只負責記憶體分配和釋放,而不管構造和析構

4樓:

new/delete沒逆向看過,

vs中malloc的實現是在申請的記憶體前面加上幾個位元組放長度和其它的一些資訊。

這樣free的時候就只需要把指標傳進去,往前找幾個位元組,獲取相關資訊,然後刪掉對應的空間即可。

而GCC下雖然也是把malloc的相關資訊放在前面,不過資料格式和vs的不一樣。

反正不管編譯器怎麼實現的malloc,free的時候都要往前數取得對應的資訊才能刪。

5樓:張萬凱

A* a = new A;

delete a;

編譯器知道a的型別是A,所以就可以把delete a這條語句翻譯成如下

A::~A(a);

free(a);

JavaScript中用new操作符建立物件的時候具體發生了什麼過程?

龔代成 第一步 建立乙個空物件,關聯建構函式的原型物件。第二步 執行建構函式,改變this的上下文,給建立的空物件屬性賦值第三步 判斷第二部執行返回的是不是物件 第四部 返回 var new2 function fn else return newObj Jacky Tsai 我也不是特別的清楚,只...

Python 中取反操作符是如何算出來的,為什麼正數的這麼怪異,負數的正常?

你那個負數取反之後每個位都會取反只是巧合罷了,不信你可以用別的數試試。Python的思路是這樣的 1 bin型別包含兩部分,第一部分是正反,第二部分是數字大小。也就是說你的bin 2 0b10,先判斷是負號,然後判斷2的大小用二進位制表示為0b10,所以就表示為 0b10。2 然後是取反,因為人們規...

關於JavaScript中加性操作符的疑問?

小爝 這屬於型別轉換問題,首先你看你呼叫的是alert方法,我們看下alert方法的解釋 引數messgae如果是個物件則轉換成string來顯示。那麼你看你的三個例子 alert bbb alert bbb alert bbb 這裡第乙個alert你測試呼叫的是toString方法,我們看下為什麼...