|
kooafssll5j64066433251.gif (60.41 KB, 下載次數(shù): 1)
下載附件
保存到相冊
kooafssll5j64066433251.gif
2024-12-5 22:02 上傳
. {& S3 [3 e- w; y9 J
點擊上方藍(lán)色字體,關(guān)注我們/ u) S/ H% u/ e3 ]' F9 h
new 與智能指針提供了類型安全、自動管理內(nèi)存等優(yōu)點,能夠更好地滿足大多數(shù)場景的需求。
. a) ?- r4 Q( }) Y' K0 [1
; j3 a' S+ I5 S9 ^. lmalloc 和 new 的區(qū)別
5 a' f8 Y& p- Q4 r1 t9 _, Omalloc 是 C 語言的內(nèi)存分配函數(shù),分配的內(nèi)存是未初始化的,并返回 void* 類型的指針。
6 ~) y8 a. O; r' A
6 T7 j1 d, @0 r, U要想將 malloc 的返回值賦給特定類型的指針,需要進(jìn)行顯式類型轉(zhuǎn)換,這就缺乏類型安全性。
) P" ` Z$ v- {* G, J
5 C2 }( Z! \+ f, N2 c, p而 C++ 的 new 操作符會自動調(diào)用構(gòu)造函數(shù),并返回指定類型的指針,避免了類型轉(zhuǎn)換問題,增加了類型安全性。
& a6 I4 w! T- P D& x8 C z
9 z5 Q) t, [3 t$ Inew 不僅分配內(nèi)存,還會調(diào)用類的構(gòu)造函數(shù)來初始化對象。而 malloc 僅分配內(nèi)存,不做初始化。
7 M, r( R9 i3 C: J8 Y' M5 p. b' S1 b* y; @/ B! |3 T
這意味著使用 malloc 時,我們無法直接管理對象的生命周期,必須手動調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)(這幾乎不常見且容易出錯)。
: y- \2 J# p: \& |2! ?: y8 N9 K) n# B
智能指針和現(xiàn)代 C++ 內(nèi)存管理. n y5 g3 W- u6 r
C++11 引入了智能指針,如 std::unique_ptr 和 std::shared_ptr,它們通過 RAII(Resource Acquisition Is Initialization)機制幫助自動管理內(nèi)存。, j# d$ C' i3 n- i. t. q
! h, w3 H+ |2 R% `
這讓開發(fā)者幾乎不需要直接調(diào)用 new 或 delete,大幅降低了內(nèi)存泄漏的風(fēng)險。更不用說 malloc 和 free 了。
/ m/ w" J: n9 v! E
% C; d/ N: n# b E$ Q例如:
3 Q! P4 O1 \' s* ]$ E' _ G) B) C! H+ o0 h. `5 G
std::unique_ptrptr = std::make_unique(10); // 自動管理內(nèi)存
- u0 D k. p6 v2 Y. `. g使用智能指針,內(nèi)存會在指針超出作用域時自動釋放,無需手動調(diào)用 free。$ _, T' l- i8 z2 h3 Y4 Z ?1 u
3
( L, I6 G f) d. j. F使用 malloc 的場景
8 o" j9 B) x! q! s* Y7 Y4 w4 h盡管現(xiàn)代 C++ 提供了更好的內(nèi)存管理工具,但在少數(shù)特定場景下,malloc 仍然可能有其用武之地。
1 U5 I: K, W8 C& K
: {0 L1 Q. ?! J4 D W如果你需要與大量 C 代碼或使用 C 庫的項目協(xié)作(如某些底層嵌入式系統(tǒng)開發(fā)),使用 malloc 會更容易實現(xiàn)與 C 代碼的無縫交互。
8 A, Y, r V d' B9 I. |! N% m2 i( t: j1 ^. L$ ]! G
在某些性能要求極高的系統(tǒng)中,為了精細(xì)控制內(nèi)存布局和管理,開發(fā)者可能會實現(xiàn)自定義的內(nèi)存分配器。
5 P; ?8 D5 Z9 }1 k4 n4 p9 j7 K! T# [7 e" n; \$ M6 ^- L1 Y5 a
自定義分配器的內(nèi)部實現(xiàn)可能基于 malloc 這種低級分配函數(shù),以便更靈活地優(yōu)化內(nèi)存操作。
9 W8 Q# G7 ^) ]
' o0 a9 i+ z) |不需要構(gòu)造函數(shù)的分配:對于不需要初始化的原始數(shù)據(jù)塊或 POD(Plain Old Data)類型數(shù)據(jù),malloc 有時可能更加直接,比如用于分配一個不需要構(gòu)造和析構(gòu)的字節(jié)緩沖區(qū)。$ g% R, g. b6 P. ~! S0 p9 \
43 O9 Z8 ]- _, g9 S% R" V5 t# v2 ~, Y
實際代碼示例- ] ?2 a) u" `
C++ 的方式! W1 q5 U8 E$ U# }9 |7 {: T# d
struct MyClass { MyClass() { std::cout "Constructed
! e+ p$ L6 [' f0 s X"; } ~MyClass() { std::cout "Destructed, B4 g5 _, [: h) i7 j7 X+ O
"; }};
0 t3 C8 y" y! vint main() { auto ptr = std::make_unique(); // 自動調(diào)用構(gòu)造/析構(gòu)}, C& S# p; Q) x Y
使用 malloc 的方式(不推薦,除非必須兼容 C); u2 f0 A( R1 N: N: }+ N7 L
struct MyClass { MyClass() { std::cout "Constructed
7 {- p! {0 m0 }# q) U0 a6 s- t"; } ~MyClass() { std::cout "Destructed
# U' W3 _7 `; |0 ~% V"; }}; n: \- l- w- G2 x% g
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# v8 \3 M" c5 y/ L+ S' ]+ n- F
在第二種方式中,手動管理構(gòu)造和析構(gòu)顯得繁瑣且不直觀,容易引入內(nèi)存泄漏或未定義行為。
- ^; d( ^0 W6 u" }- T" S
u33aa4nltj464066433351.jpg (71.14 KB, 下載次數(shù): 0)
下載附件
保存到相冊
u33aa4nltj464066433351.jpg
2024-12-5 22:02 上傳
' W/ J! L5 V. i3 S2 h* y9 x
4kkspejwcgh64066433451.gif (45.46 KB, 下載次數(shù): 0)
下載附件
保存到相冊
4kkspejwcgh64066433451.gif
2024-12-5 22:02 上傳
3 R& @* O) }. h9 w( ]2 G# E
點擊閱讀原文,更精彩~ |
|