電子產(chǎn)業(yè)一站式賦能平臺

PCB聯(lián)盟網(wǎng)

搜索
查看: 49|回復(fù): 0
收起左側(cè)

C++中還需要使用malloc嗎?

[復(fù)制鏈接]

660

主題

660

帖子

4567

積分

四級會員

Rank: 4

積分
4567
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2024-12-5 08:00:00 | 只看該作者 |只看大圖 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
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 g
  • std::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 ^* N
  • struct 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
    + Y0 S% e# L% t; n* z1 c' }
    ) p0 y, W) p5 J4 L點(diǎn)擊閱讀原文,更精彩~
  • 發(fā)表回復(fù)

    您需要登錄后才可以回帖 登錄 | 立即注冊

    本版積分規(guī)則


    聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表