|
kooafssll5j64066433251.gif (60.41 KB, 下載次數(shù): 0)
下載附件
保存到相冊
kooafssll5j64066433251.gif
2024-12-5 22:02 上傳
7 m( w2 l- I u3 Q+ e+ x2 z
點(diǎn)擊上方藍(lán)色字體,關(guān)注我們! F( M. L# W# {3 l8 ]
new 與智能指針提供了類型安全、自動管理內(nèi)存等優(yōu)點(diǎn),能夠更好地滿足大多數(shù)場景的需求。# p; J a% M3 B
1& Q! P" o1 F2 J( d& f
malloc 和 new 的區(qū)別
6 s7 g" x% e5 M) E- t+ _( K1 [malloc 是 C 語言的內(nèi)存分配函數(shù),分配的內(nèi)存是未初始化的,并返回 void* 類型的指針。
: s2 V5 X, P( a9 ?4 m G+ p# t& j% W/ t; R) K: S, j B- N
要想將 malloc 的返回值賦給特定類型的指針,需要進(jìn)行顯式類型轉(zhuǎn)換,這就缺乏類型安全性。/ \ N( ?7 ?$ A* _! ]2 D
$ \/ H7 C8 Y4 T- y) [: l
而 C++ 的 new 操作符會自動調(diào)用構(gòu)造函數(shù),并返回指定類型的指針,避免了類型轉(zhuǎn)換問題,增加了類型安全性。
- p3 r/ F3 g0 X6 A8 l2 A* |( k( L+ R$ t' ]
new 不僅分配內(nèi)存,還會調(diào)用類的構(gòu)造函數(shù)來初始化對象。而 malloc 僅分配內(nèi)存,不做初始化。
, z% N( r4 t5 A& J# C, c; S
' W: d; c: p& k [6 C這意味著使用 malloc 時,我們無法直接管理對象的生命周期,必須手動調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)(這幾乎不常見且容易出錯)。) U3 N4 b7 X9 d* H, }. r |9 e
2- C+ i% C' N: m; P
智能指針和現(xiàn)代 C++ 內(nèi)存管理
6 m- T+ H3 X# v/ eC++11 引入了智能指針,如 std::unique_ptr 和 std::shared_ptr,它們通過 RAII(Resource Acquisition Is Initialization)機(jī)制幫助自動管理內(nèi)存。3 k4 }4 l( r. |) s9 s* h
& ? ?2 l: p8 F這讓開發(fā)者幾乎不需要直接調(diào)用 new 或 delete,大幅降低了內(nèi)存泄漏的風(fēng)險(xiǎn)。更不用說 malloc 和 free 了。
4 M6 w, N8 U5 N6 a9 z8 a) q3 j# n
例如:% n0 z. K, b- \8 }5 v# {
/ Z: v$ a# w5 t7 gstd::unique_ptrptr = std::make_unique(10); // 自動管理內(nèi)存2 F* F# W$ h2 x# Y& P; d- `( U
使用智能指針,內(nèi)存會在指針超出作用域時自動釋放,無需手動調(diào)用 free。
0 r5 p `/ X' |. K' Z+ _$ P3/ A- J: G9 I# s
使用 malloc 的場景! Q8 k/ k1 ^2 Y* a* N
盡管現(xiàn)代 C++ 提供了更好的內(nèi)存管理工具,但在少數(shù)特定場景下,malloc 仍然可能有其用武之地。
7 t& i6 T% r4 ^
) e* F& Y% _/ p+ p' u" K5 ~如果你需要與大量 C 代碼或使用 C 庫的項(xiàng)目協(xié)作(如某些底層嵌入式系統(tǒng)開發(fā)),使用 malloc 會更容易實(shí)現(xiàn)與 C 代碼的無縫交互。+ t; m+ u3 u0 T% u9 N0 e
1 D* N; s' r9 G3 K1 J7 k; \# F
在某些性能要求極高的系統(tǒng)中,為了精細(xì)控制內(nèi)存布局和管理,開發(fā)者可能會實(shí)現(xiàn)自定義的內(nèi)存分配器。1 p3 F1 u5 L: z3 m/ L2 o3 G
9 |& _! m8 o% P: H) @* ^3 {; ~
自定義分配器的內(nèi)部實(shí)現(xiàn)可能基于 malloc 這種低級分配函數(shù),以便更靈活地優(yōu)化內(nèi)存操作。
4 g6 N: C/ y0 E" P9 x' y5 |# M# ?) u. U
不需要構(gòu)造函數(shù)的分配:對于不需要初始化的原始數(shù)據(jù)塊或 POD(Plain Old Data)類型數(shù)據(jù),malloc 有時可能更加直接,比如用于分配一個不需要構(gòu)造和析構(gòu)的字節(jié)緩沖區(qū)。; ]- q$ A8 n# r! l6 ]: y
4
5 K( d1 r C {+ I' N" N實(shí)際代碼示例
+ N: k6 e, l2 L# a- PC++ 的方式
5 U+ E: ]- d+ E% B9 ^* Nstruct MyClass { MyClass() { std::cout "Constructed; S+ Y. M3 c8 S9 B% \: h O
"; } ~MyClass() { std::cout "Destructed8 g- N5 C' S2 A3 O6 R9 w( M7 n
"; }};
* [7 [1 B, P, i! |" g+ Q4 f- j" L yint main() { auto ptr = std::make_unique(); // 自動調(diào)用構(gòu)造/析構(gòu)}
% a3 U% A( V8 M3 J" r; T使用 malloc 的方式(不推薦,除非必須兼容 C)% V5 a3 ? c* ]2 ~; Q$ f
struct MyClass { MyClass() { std::cout "Constructed7 r, y4 S2 X+ w: A9 [
"; } ~MyClass() { std::cout "Destructed& w2 \7 m: q$ Y. T# ^
"; }};0 V5 L2 t3 k' c5 D+ ?7 x- ]: d
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);}( R" I$ ` l: N5 f- F
在第二種方式中,手動管理構(gòu)造和析構(gòu)顯得繁瑣且不直觀,容易引入內(nèi)存泄漏或未定義行為。
! M8 r j+ U5 p+ C; g2 X
u33aa4nltj464066433351.jpg (71.14 KB, 下載次數(shù): 0)
下載附件
保存到相冊
u33aa4nltj464066433351.jpg
2024-12-5 22:02 上傳
+ Y0 S% e# L% t; n* z1 c' }
4kkspejwcgh64066433451.gif (45.46 KB, 下載次數(shù): 0)
下載附件
保存到相冊
4kkspejwcgh64066433451.gif
2024-12-5 22:02 上傳
) p0 y, W) p5 J4 L點(diǎn)擊閱讀原文,更精彩~ |
|