c++ new[] delete[]底层分析
先寫一個(gè)demo,里面有new[],delete[],使用C++11 MTd選項(xiàng)編譯:
#include <string> int main() {auto pS = new std::string[10];delete[] pS;return 0; }new的大小為0x11c,十進(jìn)制284,相當(dāng)與10*28 + 4。4個(gè)額外申請(qǐng)的長(zhǎng)度就是保存數(shù)組大小用的。
auto pS = new std::string[10]; 009C970D push 11Ch 009C9712 call operator new[] (09C376Ch) 009C9717 add esp,4 009C971A mov dword ptr [ebp-0F8h],eax在new返回的地址先寫入的數(shù)組的長(zhǎng)度10,注意返回給用戶的地址是這個(gè)地址+4后的長(zhǎng)度。
009C972E je main+9Ah (09C976Ah) 009C9730 mov eax,dword ptr [ebp-0F8h] 009C9736 mov dword ptr [eax],0Ah數(shù)組對(duì)象開始調(diào)用構(gòu)造函數(shù)初始化:
009C973C push 9C3FB9h 009C9741 push 9C31DBh 009C9746 push 0Ah //對(duì)象的個(gè)數(shù) 009C9748 push 1Ch //對(duì)象的大小 009C974A mov ecx,dword ptr [ebp-0F8h] 009C9750 add ecx,4 009C9753 push ecx //將new返回的地址+4就是第一個(gè)對(duì)象的首地址 009C9754 call `eh vector constructor iterator' (09C3EECh) 009C9759 mov edx,dword ptr [ebp-0F8h] 009C975F add edx,4 009C9762 mov dword ptr [ebp-10Ch],edx//注意這里返回的地址是+4的,這是用戶拿到的地址。復(fù)制流是這樣的[ebp-10ch]->[ebp-104h]->ecx->pS 009C9768 jmp main+0A4h (09C9774h) 009C976A mov dword ptr [ebp-10Ch],0 009C9774 mov eax,dword ptr [ebp-10Ch] 009C977A mov dword ptr [ebp-104h],eax 009C9780 mov dword ptr [ebp-4],0FFFFFFFFh 009C9787 mov ecx,dword ptr [ebp-104h] 009C978D mov dword ptr [pS],ecx所以我們調(diào)用new[]多個(gè)對(duì)象的時(shí)候,返回地址-4上保存著這個(gè)對(duì)象數(shù)組的大小。
接著我們看delete[]的時(shí)候是怎么用的:上來就是空指針檢查,即使我們C++代碼里面沒有寫。
跟入vector deleting destructor函數(shù)看看:先[pS-4]取數(shù)組的的長(zhǎng)度,調(diào)用析構(gòu)函數(shù),然后delete釋放內(nèi)存。
009C78DB push 9C3FB9h 009C78E0 mov eax,dword ptr [this] //取pS的值 009C78E3 mov ecx,dword ptr [eax-4] //取對(duì)象數(shù)組的長(zhǎng)度 009C78E6 push ecx //string對(duì)象的個(gè)數(shù)10 009C78E7 push 1Ch //strig對(duì)象的大小 009C78E9 mov edx,dword ptr [this] 009C78EC push edx 009C78ED call `eh vector destructor iterator//調(diào)用string析構(gòu)函數(shù) 009C78F2 mov eax,dword ptr [ebp+8] 009C78F5 and eax,1 009C78F8 je std::basic_string<char,std::char_traits<char>,std::allocator<char> >::`vector deleting destructor'+59h (09C7909h) 009C78FA mov eax,dword ptr [this] 009C78FD sub eax,4 //pS-4才是申請(qǐng)堆block的首地址,然后delete釋放。 009C7900 push eax 009C7901 call operator delete[] (09C3136h) 009C7906 add esp,4總結(jié):delete[]參數(shù)不用輸入數(shù)組的長(zhǎng)度,是CRT實(shí)現(xiàn)new的時(shí)候在堆userdata首地址放上了數(shù)組長(zhǎng)度,new返回的地址是申請(qǐng)到地址+4的值。然后delete[]釋放的時(shí)候,用傳入地址-4拿數(shù)組長(zhǎng)度,實(shí)現(xiàn)數(shù)組釋放。
總結(jié)
以上是生活随笔為你收集整理的c++ new[] delete[]底层分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux密码破解
- 下一篇: duilib基本布局学习(模仿百度网盘)