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

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

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

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

[復(fù)制鏈接]

660

主題

660

帖子

4567

積分

四級(jí)會(huì)員

Rank: 4

積分
4567
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2024-12-5 08:00:00 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式

% C9 _# M- M5 d1 k點(diǎn)擊上方藍(lán)色字體,關(guān)注我們
( y" t( o3 q& M0 nnew 與智能指針提供了類型安全、自動(dòng)管理內(nèi)存等優(yōu)點(diǎn),能夠更好地滿足大多數(shù)場(chǎng)景的需求。% a3 Y3 T) `  g# q  K* p
1
( N+ ]/ r9 X2 Y* U. Emalloc 和 new 的區(qū)別$ J. c  |2 K, d% w4 o. _3 N
malloc 是 C 語(yǔ)言的內(nèi)存分配函數(shù),分配的內(nèi)存是未初始化的,并返回 void* 類型的指針。# g! c" R% R4 b, r! u, g! Q

" r/ L+ m& C% S8 W: w要想將 malloc 的返回值賦給特定類型的指針,需要進(jìn)行顯式類型轉(zhuǎn)換,這就缺乏類型安全性。
6 R% A4 l; t1 x8 [3 {; ^- K9 B) m. N* I6 W6 V5 a
而 C++ 的 new 操作符會(huì)自動(dòng)調(diào)用構(gòu)造函數(shù),并返回指定類型的指針,避免了類型轉(zhuǎn)換問題,增加了類型安全性。4 B% v* `3 p) z) c% w6 R/ c

) d, g% m" G4 ~4 P9 i: h& H5 L! W" nnew 不僅分配內(nèi)存,還會(huì)調(diào)用類的構(gòu)造函數(shù)來(lái)初始化對(duì)象。而 malloc 僅分配內(nèi)存,不做初始化。
! R8 ?. r+ y& [6 [8 u2 l3 ^8 N
5 }6 O: ]0 K, ^& M6 T5 s3 J7 e: ~這意味著使用 malloc 時(shí),我們無(wú)法直接管理對(duì)象的生命周期,必須手動(dòng)調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)(這幾乎不常見且容易出錯(cuò))。
8 z9 O0 }+ M  {# O! h0 d2
0 g# Z$ w" F  T  E智能指針和現(xiàn)代 C++ 內(nèi)存管理
! U' n0 K6 T0 e9 y1 ]- g% nC++11 引入了智能指針,如 std::unique_ptr 和 std::shared_ptr,它們通過(guò) RAII(Resource Acquisition Is Initialization)機(jī)制幫助自動(dòng)管理內(nèi)存。6 \6 L( P9 I' a7 m0 O$ \

% L1 \# e3 Y) g7 A2 ?: Y這讓開發(fā)者幾乎不需要直接調(diào)用 new 或 delete,大幅降低了內(nèi)存泄漏的風(fēng)險(xiǎn)。更不用說(shuō) malloc 和 free 了。) x) V! r$ ?8 ^. e) A# y9 h

. c5 l! a0 v+ h1 f7 @6 r例如:& r( d/ u: R8 ]1 y
1 C6 h, k/ P; Y7 X/ g3 h4 B
  • std::unique_ptrptr = std::make_unique(10);  // 自動(dòng)管理內(nèi)存
    4 `& Q/ @  i7 d# D8 ]! @使用智能指針,內(nèi)存會(huì)在指針超出作用域時(shí)自動(dòng)釋放,無(wú)需手動(dòng)調(diào)用 free。, x/ p3 I) C6 O) l5 c8 ~% H7 G0 h
    3* \5 F% Y/ q0 D2 X4 ^( n% I
    使用 malloc 的場(chǎng)景
    4 ]- a# }5 c" Y3 m盡管現(xiàn)代 C++ 提供了更好的內(nèi)存管理工具,但在少數(shù)特定場(chǎng)景下,malloc 仍然可能有其用武之地。
    & t2 K) X, H7 W  j  p! O$ ^9 W" l6 ~) u# R, ?
    如果你需要與大量 C 代碼或使用 C 庫(kù)的項(xiàng)目協(xié)作(如某些底層嵌入式系統(tǒng)開發(fā)),使用 malloc 會(huì)更容易實(shí)現(xiàn)與 C 代碼的無(wú)縫交互。
    % |  k5 p5 O* M; w1 b/ r! w
    : o4 P% P8 Y1 |# k# z在某些性能要求極高的系統(tǒng)中,為了精細(xì)控制內(nèi)存布局和管理,開發(fā)者可能會(huì)實(shí)現(xiàn)自定義的內(nèi)存分配器。
    5 i! J( C+ h# ^) R
    ; b) l5 C; Y* _, O+ B/ \3 ^: p/ L' ]; @自定義分配器的內(nèi)部實(shí)現(xiàn)可能基于 malloc 這種低級(jí)分配函數(shù),以便更靈活地優(yōu)化內(nèi)存操作。
    7 Q- `# r  F; F! D
    ! G/ E$ K; p) e不需要構(gòu)造函數(shù)的分配:對(duì)于不需要初始化的原始數(shù)據(jù)塊或 POD(Plain Old Data)類型數(shù)據(jù),malloc 有時(shí)可能更加直接,比如用于分配一個(gè)不需要構(gòu)造和析構(gòu)的字節(jié)緩沖區(qū)。
    * L+ H* w. ]1 j7 {4
    ; C$ a2 A: b( D$ F9 T實(shí)際代碼示例/ ~! n6 u( k6 D3 E
    C++ 的方式
    ( Q6 J/ O5 i- i, I4 `' S/ C
  • struct MyClass {    MyClass() { std::cout "Constructed- n9 `1 t* P& Z) _
    "; }    ~MyClass() { std::cout "Destructed7 _- x* H1 e- [" G# f
    "; }};
    9 D, c4 |9 [* |  ]* c1 f4 U$ aint main() {    auto ptr = std::make_unique();  // 自動(dòng)調(diào)用構(gòu)造/析構(gòu)}
    - u2 u7 T8 P- ]$ U) Y* U( W使用 malloc 的方式(不推薦,除非必須兼容 C)
    ; g6 @: x9 H  E: h
  • struct MyClass {    MyClass() { std::cout "Constructed
    $ N2 v: W, f7 l' T2 v4 _: W"; }    ~MyClass() { std::cout "Destructed' G9 v, c/ m( F! P; Q: J" {) a
    "; }};
    . p% m4 a2 u* S7 u7 w( c6 m" {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);}; ~$ M; D! H7 @: Z! j. ]
    在第二種方式中,手動(dòng)管理構(gòu)造和析構(gòu)顯得繁瑣且不直觀,容易引入內(nèi)存泄漏或未定義行為。% ]8 o# x1 l2 J9 l( J
    0 E* x& {9 c# J" F
    : E" J( ]1 e6 @9 T# U$ X5 D
    點(diǎn)擊閱讀原文,更精彩~
  • 發(fā)表回復(fù)

    本版積分規(guī)則


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