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

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

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

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

[復(fù)制鏈接]

660

主題

660

帖子

4567

積分

四級會員

Rank: 4

積分
4567
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2024-12-5 08:00:00 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
. {& 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 ' W/ J! L5 V. i3 S2 h* y9 x
    3 R& @* O) }. h9 w( ]2 G# E
    點擊閱讀原文,更精彩~
  • 回復(fù)

    使用道具 舉報

    發(fā)表回復(fù)

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

    本版積分規(guī)則


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