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

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

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

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

[復制鏈接]

660

主題

660

帖子

4567

積分

四級會員

Rank: 4

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

. 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 E
  • struct 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 ! L+ k4 }# E1 d
    9 T/ y; g5 G, I
    點擊閱讀原文,更精彩~
  • 回復

    使用道具 舉報

    發(fā)表回復

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

    本版積分規(guī)則


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