|
kooafssll5j64066433251.gif (60.41 KB, 下載次數(shù): 1)
下載附件
保存到相冊
kooafssll5j64066433251.gif
2024-12-5 22:02 上傳
! p& U4 X' B: M+ i3 c9 w* `$ E點(diǎn)擊上方藍(lán)色字體,關(guān)注我們* M: j, I$ _( @* _
new 與智能指針提供了類型安全、自動(dòng)管理內(nèi)存等優(yōu)點(diǎn),能夠更好地滿足大多數(shù)場景的需求。2 t3 S7 Y# R& A5 c, j1 e
1
% M1 i- E/ U& _5 Pmalloc 和 new 的區(qū)別
7 V1 d+ V7 h; p: Y p4 r! Q# ]malloc 是 C 語言的內(nèi)存分配函數(shù),分配的內(nèi)存是未初始化的,并返回 void* 類型的指針。; C2 P: t$ @. |' N! \
& B3 }# U- Q( l: m" `, \: `3 c要想將 malloc 的返回值賦給特定類型的指針,需要進(jìn)行顯式類型轉(zhuǎn)換,這就缺乏類型安全性。
3 d! p- x2 i4 }# h3 S6 [7 G0 d+ x4 ~( Y3 D2 }# r/ L
而 C++ 的 new 操作符會(huì)自動(dòng)調(diào)用構(gòu)造函數(shù),并返回指定類型的指針,避免了類型轉(zhuǎn)換問題,增加了類型安全性。
0 K( n. O: d4 T3 X) G9 Q
) S+ Q/ U5 ]* f7 M2 [new 不僅分配內(nèi)存,還會(huì)調(diào)用類的構(gòu)造函數(shù)來初始化對(duì)象。而 malloc 僅分配內(nèi)存,不做初始化。
; w& [1 |7 ^& K: [; v" m/ [7 f
4 v% w: x e* C/ @$ N, S/ ~, K0 n這意味著使用 malloc 時(shí),我們無法直接管理對(duì)象的生命周期,必須手動(dòng)調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)(這幾乎不常見且容易出錯(cuò))。
) T5 x/ s' i# J" C! `8 y2
- G/ C! T5 M `( N* e智能指針和現(xiàn)代 C++ 內(nèi)存管理
8 P) e1 t7 X' e+ r& OC++11 引入了智能指針,如 std::unique_ptr 和 std::shared_ptr,它們通過 RAII(Resource Acquisition Is Initialization)機(jī)制幫助自動(dòng)管理內(nèi)存。
0 k/ v4 v+ z8 Y8 R% x- Z+ ^
$ b0 z8 U* p. }$ M這讓開發(fā)者幾乎不需要直接調(diào)用 new 或 delete,大幅降低了內(nèi)存泄漏的風(fēng)險(xiǎn)。更不用說 malloc 和 free 了。
1 B5 z/ I# i8 }" c" E7 G) y( F4 e* g" v; K( M8 D" O, H# p2 |
例如:
( O$ j, j2 C$ V8 g
! B- l& A3 A6 u, p4 dstd::unique_ptrptr = std::make_unique(10); // 自動(dòng)管理內(nèi)存
2 F" a% _) i. z使用智能指針,內(nèi)存會(huì)在指針超出作用域時(shí)自動(dòng)釋放,無需手動(dòng)調(diào)用 free。
! O% }, d% v. P! {, {0 [ a, D3
' q& ~. p$ ^5 Q* Q+ h/ e使用 malloc 的場景
! r5 O( C$ f& c6 S1 t7 y( N" l1 N盡管現(xiàn)代 C++ 提供了更好的內(nèi)存管理工具,但在少數(shù)特定場景下,malloc 仍然可能有其用武之地。
' e, R/ G" x I( }
( o$ O) X: L4 r! }如果你需要與大量 C 代碼或使用 C 庫的項(xiàng)目協(xié)作(如某些底層嵌入式系統(tǒng)開發(fā)),使用 malloc 會(huì)更容易實(shí)現(xiàn)與 C 代碼的無縫交互。
' Y+ i2 }! g3 b" M. G' w/ }* h! a" r
在某些性能要求極高的系統(tǒng)中,為了精細(xì)控制內(nèi)存布局和管理,開發(fā)者可能會(huì)實(shí)現(xiàn)自定義的內(nèi)存分配器。# `* I/ T* ?6 I
- L1 [8 N6 F8 a, d; N' A
自定義分配器的內(nèi)部實(shí)現(xiàn)可能基于 malloc 這種低級(jí)分配函數(shù),以便更靈活地優(yōu)化內(nèi)存操作。( F8 _5 `' J6 F2 j; r, y# n
& p' V* ~* n F1 z( V1 a不需要構(gòu)造函數(shù)的分配:對(duì)于不需要初始化的原始數(shù)據(jù)塊或 POD(Plain Old Data)類型數(shù)據(jù),malloc 有時(shí)可能更加直接,比如用于分配一個(gè)不需要構(gòu)造和析構(gòu)的字節(jié)緩沖區(qū)。+ H$ W% f2 _6 V( m
4% y4 }9 o! U- p/ i p# U/ j$ A
實(shí)際代碼示例
4 i: o, h, W8 F3 ]! RC++ 的方式
2 q2 k3 j9 j. tstruct MyClass { MyClass() { std::cout "Constructed# I4 m6 ]" n( t5 \9 n
"; } ~MyClass() { std::cout "Destructed7 e8 {8 z4 Z# N% y! s7 D! m: ?% j
"; }};
8 T# r5 R9 Y4 X3 c) m, Z& yint main() { auto ptr = std::make_unique(); // 自動(dòng)調(diào)用構(gòu)造/析構(gòu)}
7 G T) B7 u* k! \3 u) {使用 malloc 的方式(不推薦,除非必須兼容 C)3 o* v% p! ?4 C7 `" q9 L
struct MyClass { MyClass() { std::cout "Constructed! |: K D/ i6 n- n7 p% b, }" t7 A
"; } ~MyClass() { std::cout "Destructed& i) ?. k% \/ G0 e9 n. ^
"; }};# x6 f" S$ c+ V; A4 V, b
int 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 x" D) P1 h0 Q7 ~/ W. }在第二種方式中,手動(dòng)管理構(gòu)造和析構(gòu)顯得繁瑣且不直觀,容易引入內(nèi)存泄漏或未定義行為。4 Q7 i" [" O; D( v1 S
u33aa4nltj464066433351.jpg (71.14 KB, 下載次數(shù): 2)
下載附件
保存到相冊
u33aa4nltj464066433351.jpg
2024-12-5 22:02 上傳
0 D. T" o- y. S7 L
4kkspejwcgh64066433451.gif (45.46 KB, 下載次數(shù): 2)
下載附件
保存到相冊
4kkspejwcgh64066433451.gif
2024-12-5 22:02 上傳
1 M: [5 P% J& T$ k1 X) G" }點(diǎn)擊閱讀原文,更精彩~ |
|