日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

c++ new[] delete[]底层分析

發(fā)布時間:2025/3/21 c/c++ 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++ new[] delete[]底层分析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

先寫一個demo,里面有new[],delete[],使用C++11 MTd選項編譯:

#include <string> int main() {auto pS = new std::string[10];delete[] pS;return 0; }

new的大小為0x11c,十進制284,相當(dāng)與10*28 + 4。4個額外申請的長度就是保存數(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ù)組的長度10,注意返回給用戶的地址是這個地址+4后的長度。

009C972E je main+9Ah (09C976Ah) 009C9730 mov eax,dword ptr [ebp-0F8h] 009C9736 mov dword ptr [eax],0Ah

數(shù)組對象開始調(diào)用構(gòu)造函數(shù)初始化:

009C973C push 9C3FB9h 009C9741 push 9C31DBh 009C9746 push 0Ah //對象的個數(shù) 009C9748 push 1Ch //對象的大小 009C974A mov ecx,dword ptr [ebp-0F8h] 009C9750 add ecx,4 009C9753 push ecx //將new返回的地址+4就是第一個對象的首地址 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[]多個對象的時候,返回地址-4上保存著這個對象數(shù)組的大小。
接著我們看delete[]的時候是怎么用的:上來就是空指針檢查,即使我們C++代碼里面沒有寫。

delete[] pS; 009C9790 mov eax,dword ptr [pS] 009C9793 mov dword ptr [ebp-0E0h],eax 009C9799 mov ecx,dword ptr [ebp-0E0h] 009C979F mov dword ptr [ebp-0ECh],ecx 009C97A5 cmp dword ptr [ebp-0ECh],0 //檢查pS是否為NULL 009C97AC je main+0F3h (09C97C3h) 009C97AE push 3 delete[] pS; 009C97B0 mov ecx,dword ptr [ebp-0ECh] 009C97B6 call std::basic_string<char,std::char_traits<char>,std::allocator<char> >::`vector deleting destructor' (09C4216h)

跟入vector deleting destructor函數(shù)看看:先[pS-4]取數(shù)組的的長度,調(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] //取對象數(shù)組的長度 009C78E6 push ecx //string對象的個數(shù)10 009C78E7 push 1Ch //strig對象的大小 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才是申請堆block的首地址,然后delete釋放。 009C7900 push eax 009C7901 call operator delete[] (09C3136h) 009C7906 add esp,4

總結(jié):delete[]參數(shù)不用輸入數(shù)組的長度,是CRT實現(xiàn)new的時候在堆userdata首地址放上了數(shù)組長度,new返回的地址是申請到地址+4的值。然后delete[]釋放的時候,用傳入地址-4拿數(shù)組長度,實現(xiàn)數(shù)組釋放。

總結(jié)

以上是生活随笔為你收集整理的c++ new[] delete[]底层分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。