|
kooafssll5j64066433251.gif (60.41 KB, 下載次數(shù): 0)
下載附件
保存到相冊(cè)
kooafssll5j64066433251.gif
2024-12-5 22:02 上傳
% j0 i: \* X- M點(diǎn)擊上方藍(lán)色字體,關(guān)注我們
0 Q$ G6 h# r+ d+ rnew 與智能指針提供了類型安全、自動(dòng)管理內(nèi)存等優(yōu)點(diǎn),能夠更好地滿足大多數(shù)場(chǎng)景的需求。
$ d, w$ w" n& K, P1
r+ f! n+ |4 o& W# Lmalloc 和 new 的區(qū)別. M! g) f0 ?8 |: p! m
malloc 是 C 語(yǔ)言的內(nèi)存分配函數(shù),分配的內(nèi)存是未初始化的,并返回 void* 類型的指針。/ c6 ~+ U0 U) I8 F* n
) _1 ^6 \; ?0 ?) b9 B! d
要想將 malloc 的返回值賦給特定類型的指針,需要進(jìn)行顯式類型轉(zhuǎn)換,這就缺乏類型安全性。$ U3 s& U: Q6 [5 q- s" f
4 J+ ]/ ~! s8 l5 W. K3 V* ~" }而 C++ 的 new 操作符會(huì)自動(dòng)調(diào)用構(gòu)造函數(shù),并返回指定類型的指針,避免了類型轉(zhuǎn)換問(wèn)題,增加了類型安全性。* H7 P. J* [$ z
- Q; a/ v' G' Z3 y; Lnew 不僅分配內(nèi)存,還會(huì)調(diào)用類的構(gòu)造函數(shù)來(lái)初始化對(duì)象。而 malloc 僅分配內(nèi)存,不做初始化。 Q5 d( [# R4 s: ^' y+ ]$ G& U3 K4 B
% o m8 e/ e8 ~: |9 \0 l% m- f* }: F
這意味著使用 malloc 時(shí),我們無(wú)法直接管理對(duì)象的生命周期,必須手動(dòng)調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)(這幾乎不常見(jiàn)且容易出錯(cuò))。- \. C; R' T2 B5 g% T# f e% w
27 j+ u" l" K/ z6 @
智能指針和現(xiàn)代 C++ 內(nèi)存管理
0 g% i( q. U1 P+ a |C++11 引入了智能指針,如 std::unique_ptr 和 std::shared_ptr,它們通過(guò) RAII(Resource Acquisition Is Initialization)機(jī)制幫助自動(dòng)管理內(nèi)存。; G) g6 b2 X* d, l: J
E0 Z2 J( D* \+ T( Q
這讓開(kāi)發(fā)者幾乎不需要直接調(diào)用 new 或 delete,大幅降低了內(nèi)存泄漏的風(fēng)險(xiǎn)。更不用說(shuō) malloc 和 free 了。
% g1 C) ^$ y! x5 Q9 i8 |" b/ `8 m3 R5 p% W. H w8 z; I5 o* i' x
例如:
& ^7 _# W8 P ~% X
& q* w w4 }$ [7 t7 _) Ystd::unique_ptrptr = std::make_unique(10); // 自動(dòng)管理內(nèi)存6 P. N1 S# j7 t5 w
使用智能指針,內(nèi)存會(huì)在指針超出作用域時(shí)自動(dòng)釋放,無(wú)需手動(dòng)調(diào)用 free。 s) _- D: b( d7 t' P+ B K+ d
3
- N' R- t& j7 J2 j9 C# W. g9 ~. T使用 malloc 的場(chǎng)景
7 g# p" T q8 E+ j, U8 E$ Z) j盡管現(xiàn)代 C++ 提供了更好的內(nèi)存管理工具,但在少數(shù)特定場(chǎng)景下,malloc 仍然可能有其用武之地。
4 r: |% D9 D6 g& ~1 T
& F0 e+ o9 h. C- l+ p! }如果你需要與大量 C 代碼或使用 C 庫(kù)的項(xiàng)目協(xié)作(如某些底層嵌入式系統(tǒng)開(kāi)發(fā)),使用 malloc 會(huì)更容易實(shí)現(xiàn)與 C 代碼的無(wú)縫交互。- ?3 e! C( p9 `3 i# L
# G" x1 R3 }/ @* S6 |: a& g/ X在某些性能要求極高的系統(tǒng)中,為了精細(xì)控制內(nèi)存布局和管理,開(kāi)發(fā)者可能會(huì)實(shí)現(xiàn)自定義的內(nèi)存分配器。
$ w0 [7 e# D7 F& ^, P5 _
0 B. T# ]7 I& n5 ]! p0 |7 B自定義分配器的內(nèi)部實(shí)現(xiàn)可能基于 malloc 這種低級(jí)分配函數(shù),以便更靈活地優(yōu)化內(nèi)存操作。
& Q: U4 q6 A. X$ k- B0 U5 n% [. C8 ]6 I# y [% h4 w. @* E
不需要構(gòu)造函數(shù)的分配:對(duì)于不需要初始化的原始數(shù)據(jù)塊或 POD(Plain Old Data)類型數(shù)據(jù),malloc 有時(shí)可能更加直接,比如用于分配一個(gè)不需要構(gòu)造和析構(gòu)的字節(jié)緩沖區(qū)。* m+ X# j s: e$ x5 l: M& D7 Y0 c- [
4' H& b+ ] U7 n4 ~. j6 p# j2 K
實(shí)際代碼示例# b) K5 _' U: f' j5 @! f/ w, Z
C++ 的方式
/ x) V4 ^7 k8 ~4 Xstruct MyClass { MyClass() { std::cout "Constructed
. |7 A# W$ ], n- U ?- n"; } ~MyClass() { std::cout "Destructed! A9 p2 L5 [% t% f" h; \! _1 ?
"; }};3 A: ^+ o; _: u) ?5 ^' R6 F* Z" Y5 u
int main() { auto ptr = std::make_unique(); // 自動(dòng)調(diào)用構(gòu)造/析構(gòu)}' L8 g& Z4 F R \4 A
使用 malloc 的方式(不推薦,除非必須兼容 C)3 D& }' Y+ C( [5 U
struct MyClass { MyClass() { std::cout "Constructed
; F: b7 f& F* f! i"; } ~MyClass() { std::cout "Destructed8 c" B; I/ W. l8 q
"; }};
2 `" b7 `: i6 R& B3 ~$ zint main() { MyClass* ptr = (MyClass*)malloc(sizeof(MyClass)); new(ptr) MyClass; // 手動(dòng)調(diào)用構(gòu)造函數(shù) ptr->~MyClass(); // 手動(dòng)調(diào)用析構(gòu)函數(shù) free(ptr);}8 y. {$ M9 W* B( x
在第二種方式中,手動(dòng)管理構(gòu)造和析構(gòu)顯得繁瑣且不直觀,容易引入內(nèi)存泄漏或未定義行為。) t5 M+ F% W% n$ i% @$ R' m
u33aa4nltj464066433351.jpg (71.14 KB, 下載次數(shù): 0)
下載附件
保存到相冊(cè)
u33aa4nltj464066433351.jpg
2024-12-5 22:02 上傳
, M! C! h8 F* {2 x. ~! S( a
4kkspejwcgh64066433451.gif (45.46 KB, 下載次數(shù): 0)
下載附件
保存到相冊(cè)
4kkspejwcgh64066433451.gif
2024-12-5 22:02 上傳
/ s% v3 \( }( o. c) D9 l點(diǎn)擊閱讀原文,更精彩~ |
|