|
kooafssll5j64066433251.gif (60.41 KB, 下載次數(shù): 1)
下載附件
保存到相冊
kooafssll5j64066433251.gif
2024-12-5 22:02 上傳
. A9 R" V* `: u5 z+ x. a% O A點擊上方藍色字體,關(guān)注我們
r. D! @. ~4 l5 ~! X H5 Inew 與智能指針提供了類型安全、自動管理內(nèi)存等優(yōu)點,能夠更好地滿足大多數(shù)場景的需求。8 n) G1 x' z& u4 x) E8 ^
1: Z( A, U0 P) F1 D- J) F
malloc 和 new 的區(qū)別
* B' M- ?' n4 k/ J6 wmalloc 是 C 語言的內(nèi)存分配函數(shù),分配的內(nèi)存是未初始化的,并返回 void* 類型的指針。$ E6 |; g3 k- D* H& U
; ~; f# F E; |5 P) @" O9 D
要想將 malloc 的返回值賦給特定類型的指針,需要進行顯式類型轉(zhuǎn)換,這就缺乏類型安全性。
- t, v9 T1 m* ~/ O; Y0 |( H& J8 [& L8 @5 I9 A
而 C++ 的 new 操作符會自動調(diào)用構(gòu)造函數(shù),并返回指定類型的指針,避免了類型轉(zhuǎn)換問題,增加了類型安全性。& @, ~, C5 [, d* c3 W- o+ n' `* S. j
& F" j( _: h# y4 D7 Q
new 不僅分配內(nèi)存,還會調(diào)用類的構(gòu)造函數(shù)來初始化對象。而 malloc 僅分配內(nèi)存,不做初始化。
) u( U2 g- a" p' B; [0 j8 S. b) H/ X, C
這意味著使用 malloc 時,我們無法直接管理對象的生命周期,必須手動調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)(這幾乎不常見且容易出錯)。
+ D8 \! {) |+ A" |; A8 a! u2
; E2 ~$ c% x* _7 w$ g智能指針和現(xiàn)代 C++ 內(nèi)存管理
0 H: j$ W7 G& T9 _5 o- bC++11 引入了智能指針,如 std::unique_ptr 和 std::shared_ptr,它們通過 RAII(Resource Acquisition Is Initialization)機制幫助自動管理內(nèi)存。( @. J) P: q9 M K+ Z
; L2 G: c. L8 I2 Z Y1 U
這讓開發(fā)者幾乎不需要直接調(diào)用 new 或 delete,大幅降低了內(nèi)存泄漏的風險。更不用說 malloc 和 free 了。2 [3 F- W3 U' s$ |, W
; b, [9 j- U5 |8 A* _2 A( O2 E例如:$ L2 _) K! X3 N/ H/ l" t
5 {$ N- S2 @ m
std::unique_ptrptr = std::make_unique(10); // 自動管理內(nèi)存
) M7 X9 f3 V2 P+ B _使用智能指針,內(nèi)存會在指針超出作用域時自動釋放,無需手動調(diào)用 free。* S7 |$ J1 l1 Z3 K; k; s
3
% k% L" J9 D: T9 J, j使用 malloc 的場景
# D# j+ g4 I* H# [( j" H盡管現(xiàn)代 C++ 提供了更好的內(nèi)存管理工具,但在少數(shù)特定場景下,malloc 仍然可能有其用武之地。
8 Y/ r' H, V6 q* j& v
* M% e& }8 b2 G, w! u3 O; a ~! d如果你需要與大量 C 代碼或使用 C 庫的項目協(xié)作(如某些底層嵌入式系統(tǒng)開發(fā)),使用 malloc 會更容易實現(xiàn)與 C 代碼的無縫交互。
8 n& v( Z8 C1 V! A$ x- h, Q2 [8 y2 F9 G. |/ G) K; Y H0 [
在某些性能要求極高的系統(tǒng)中,為了精細控制內(nèi)存布局和管理,開發(fā)者可能會實現(xiàn)自定義的內(nèi)存分配器。
: L& I) x& d$ N, S+ l/ w& P4 a) B
G% F5 ^% a# D" k7 f$ Z: a( ^自定義分配器的內(nèi)部實現(xiàn)可能基于 malloc 這種低級分配函數(shù),以便更靈活地優(yōu)化內(nèi)存操作。% s3 T: I! ]" u" _, a5 t
& g6 i' Z2 i, h" _
不需要構(gòu)造函數(shù)的分配:對于不需要初始化的原始數(shù)據(jù)塊或 POD(Plain Old Data)類型數(shù)據(jù),malloc 有時可能更加直接,比如用于分配一個不需要構(gòu)造和析構(gòu)的字節(jié)緩沖區(qū)。; O, z, T& b* `4 h+ i7 t: f
4
, x; }! Q6 B9 g5 k. F0 N- b實際代碼示例
9 w: v( @! T. D- j- e9 S6 CC++ 的方式
" A' r' [. {+ j; n+ t2 k9 Estruct MyClass { MyClass() { std::cout "Constructed% V" h8 M: T% W1 q- h2 E
"; } ~MyClass() { std::cout "Destructed
- N: m+ h3 ], w3 u7 {& ]! Z: b2 ^8 K"; }};
! t2 c- b; ]4 i) f9 m2 K9 lint main() { auto ptr = std::make_unique(); // 自動調(diào)用構(gòu)造/析構(gòu)}
2 }1 b) `" Y3 b: q! B3 o" x使用 malloc 的方式(不推薦,除非必須兼容 C)2 O' x% t$ u% m# V4 D
struct MyClass { MyClass() { std::cout "Constructed) ^) z: V! u2 n: ^3 }% S8 y; Z% V
"; } ~MyClass() { std::cout "Destructed
; B/ k, s' l) L"; }};
& X/ ~, I3 Z3 z& B [int main() { MyClass* ptr = (MyClass*)malloc(sizeof(MyClass)); new(ptr) MyClass; // 手動調(diào)用構(gòu)造函數(shù) ptr->~MyClass(); // 手動調(diào)用析構(gòu)函數(shù) free(ptr);}
6 D8 e1 z; Z6 y s8 m在第二種方式中,手動管理構(gòu)造和析構(gòu)顯得繁瑣且不直觀,容易引入內(nèi)存泄漏或未定義行為。
" |/ [% p- l7 G
u33aa4nltj464066433351.jpg (71.14 KB, 下載次數(shù): 0)
下載附件
保存到相冊
u33aa4nltj464066433351.jpg
2024-12-5 22:02 上傳
! L+ k4 }# E1 d
4kkspejwcgh64066433451.gif (45.46 KB, 下載次數(shù): 0)
下載附件
保存到相冊
4kkspejwcgh64066433451.gif
2024-12-5 22:02 上傳
9 T/ y; g5 G, I
點擊閱讀原文,更精彩~ |
|