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

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

搜索
查看: 48|回復(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覽 |閱讀模式

% j0 i: \* X- M點(diǎn)擊上方藍(lán)色字體,關(guān)注我們
0 Q$ G6 h# r+ d+ rnew 與智能指針提供了類型安全、自動(dòng)管理內(nèi)存等優(yōu)點(diǎn),能夠更好地滿足大多數(shù)場(chǎng)景的需求。
$ d, w$ w" n& K, P1
  r+ f! n+ |4 o& W# Lmalloc 和 new 的區(qū)別. M! g) f0 ?8 |: p! m
malloc 是 C 語(yǔ)言的內(nèi)存分配函數(shù),分配的內(nèi)存是未初始化的,并返回 void* 類型的指針。/ c6 ~+ U0 U) I8 F* n
) _1 ^6 \; ?0 ?) b9 B! d
要想將 malloc 的返回值賦給特定類型的指針,需要進(jìn)行顯式類型轉(zhuǎn)換,這就缺乏類型安全性。$ U3 s& U: Q6 [5 q- s" f

4 J+ ]/ ~! s8 l5 W. K3 V* ~" }而 C++ 的 new 操作符會(huì)自動(dòng)調(diào)用構(gòu)造函數(shù),并返回指定類型的指針,避免了類型轉(zhuǎn)換問(wèn)題,增加了類型安全性。* H7 P. J* [$ z

- Q; a/ v' G' Z3 y; Lnew 不僅分配內(nèi)存,還會(huì)調(diào)用類的構(gòu)造函數(shù)來(lái)初始化對(duì)象。而 malloc 僅分配內(nèi)存,不做初始化。  Q5 d( [# R4 s: ^' y+ ]$ G& U3 K4 B
% o  m8 e/ e8 ~: |9 \0 l% m- f* }: F
這意味著使用 malloc 時(shí),我們無(wú)法直接管理對(duì)象的生命周期,必須手動(dòng)調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)(這幾乎不常見(jiàn)且容易出錯(cuò))。- \. C; R' T2 B5 g% T# f  e% w
27 j+ u" l" K/ z6 @
智能指針和現(xiàn)代 C++ 內(nèi)存管理
0 g% i( q. U1 P+ a  |C++11 引入了智能指針,如 std::unique_ptr 和 std::shared_ptr,它們通過(guò) RAII(Resource Acquisition Is Initialization)機(jī)制幫助自動(dòng)管理內(nèi)存。; G) g6 b2 X* d, l: J
  E0 Z2 J( D* \+ T( Q
這讓開(kāi)發(fā)者幾乎不需要直接調(diào)用 new 或 delete,大幅降低了內(nèi)存泄漏的風(fēng)險(xiǎn)。更不用說(shuō) malloc 和 free 了。
% g1 C) ^$ y! x5 Q9 i8 |" b/ `8 m3 R5 p% W. H  w8 z; I5 o* i' x
例如:
& ^7 _# W8 P  ~% X
& q* w  w4 }$ [7 t7 _) Y
  • std::unique_ptrptr = std::make_unique(10);  // 自動(dòng)管理內(nèi)存6 P. N1 S# j7 t5 w
    使用智能指針,內(nèi)存會(huì)在指針超出作用域時(shí)自動(dòng)釋放,無(wú)需手動(dòng)調(diào)用 free。  s) _- D: b( d7 t' P+ B  K+ d
    3
    - N' R- t& j7 J2 j9 C# W. g9 ~. T使用 malloc 的場(chǎng)景
    7 g# p" T  q8 E+ j, U8 E$ Z) j盡管現(xiàn)代 C++ 提供了更好的內(nèi)存管理工具,但在少數(shù)特定場(chǎng)景下,malloc 仍然可能有其用武之地。
    4 r: |% D9 D6 g& ~1 T
    & F0 e+ o9 h. C- l+ p! }如果你需要與大量 C 代碼或使用 C 庫(kù)的項(xiàng)目協(xié)作(如某些底層嵌入式系統(tǒng)開(kāi)發(fā)),使用 malloc 會(huì)更容易實(shí)現(xiàn)與 C 代碼的無(wú)縫交互。- ?3 e! C( p9 `3 i# L

    # G" x1 R3 }/ @* S6 |: a& g/ X在某些性能要求極高的系統(tǒng)中,為了精細(xì)控制內(nèi)存布局和管理,開(kāi)發(fā)者可能會(huì)實(shí)現(xiàn)自定義的內(nèi)存分配器。
    $ w0 [7 e# D7 F& ^, P5 _
    0 B. T# ]7 I& n5 ]! p0 |7 B自定義分配器的內(nèi)部實(shí)現(xiàn)可能基于 malloc 這種低級(jí)分配函數(shù),以便更靈活地優(yōu)化內(nèi)存操作。
    & Q: U4 q6 A. X$ k- B0 U5 n% [. C8 ]6 I# y  [% h4 w. @* E
    不需要構(gòu)造函數(shù)的分配:對(duì)于不需要初始化的原始數(shù)據(jù)塊或 POD(Plain Old Data)類型數(shù)據(jù),malloc 有時(shí)可能更加直接,比如用于分配一個(gè)不需要構(gòu)造和析構(gòu)的字節(jié)緩沖區(qū)。* m+ X# j  s: e$ x5 l: M& D7 Y0 c- [
    4' H& b+ ]  U7 n4 ~. j6 p# j2 K
    實(shí)際代碼示例# b) K5 _' U: f' j5 @! f/ w, Z
    C++ 的方式
    / x) V4 ^7 k8 ~4 X
  • struct MyClass {    MyClass() { std::cout "Constructed
    . |7 A# W$ ], n- U  ?- n"; }    ~MyClass() { std::cout "Destructed! A9 p2 L5 [% t% f" h; \! _1 ?
    "; }};3 A: ^+ o; _: u) ?5 ^' R6 F* Z" Y5 u
    int main() {    auto ptr = std::make_unique();  // 自動(dòng)調(diào)用構(gòu)造/析構(gòu)}' L8 g& Z4 F  R  \4 A
    使用 malloc 的方式(不推薦,除非必須兼容 C)3 D& }' Y+ C( [5 U
  • struct MyClass {    MyClass() { std::cout "Constructed
    ; F: b7 f& F* f! i"; }    ~MyClass() { std::cout "Destructed8 c" B; I/ W. l8 q
    "; }};
    2 `" b7 `: i6 R& B3 ~$ zint 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);}8 y. {$ M9 W* B( x
    在第二種方式中,手動(dòng)管理構(gòu)造和析構(gòu)顯得繁瑣且不直觀,容易引入內(nèi)存泄漏或未定義行為。) t5 M+ F% W% n$ i% @$ R' m

    , M! C! h8 F* {2 x. ~! S( a
    / s% v3 \( }( o. c) D9 l點(diǎn)擊閱讀原文,更精彩~
  • 發(fā)表回復(fù)

    本版積分規(guī)則


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