日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

为什么`malloc`出来的内存也能当成对象正常使用

發(fā)布時間:2025/3/15 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 为什么`malloc`出来的内存也能当成对象正常使用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

為什么malloc出來的對象也能正常使用

新學習C++語言的人會感覺到很疑惑,因為相比于C語言,C++多了個類;也正是這個類給很多人帶來了困擾,class究竟是什么,它和struct的差別又是什么?

結(jié)構(gòu)體我們能使用new申請,也能使用malloc申請使用都沒有問題,但是在類的創(chuàng)建教科書中給的方法是使用new進行創(chuàng)建。為什么一定要使用new進行創(chuàng)建?

搜索new和malloc的區(qū)別我們可以看到如下說明:

  • malloc與free是c++/c語言的標準函數(shù),new/delete是C++的運算符。
  • new返回指定類型的指針,并且可以自動計算出所需的大小
  • new不僅會申請一塊內(nèi)存還會主動調(diào)用申請對象的構(gòu)造函數(shù),然后delete在清除對象的時候會主動的調(diào)用對象的析構(gòu)函數(shù)。
  • 其實new內(nèi)部也是調(diào)用malloc實現(xiàn)的,只不過new更加智能,除了會自動計算出所需大小還會主動調(diào)用所申請對象構(gòu)造函數(shù)。

    那么我們要是想使用malloc申請類對象,只需要保證申請的內(nèi)存夠用,然后手動調(diào)用成員函數(shù)對需要初始化或者賦值的數(shù)據(jù)進行賦值即可:

    using namespace std; class Base { public:void SetData(int32_t data) {m_data = data;}int32_t GetData() const {return m_data;} private:int32_t m_data{12}; };// 調(diào)用malloc申請對象 Base* lpBase = static_cast<Base *>(malloc(sizeof(Base))); // 調(diào)用成員函數(shù) 對成員變量進行賦值 lpBase->SetData(12); // 取出成員變量并輸出 cout << lpBase->GetData() << endl; // output : 12

    從輸出結(jié)果可以看出,就算是malloc申請的內(nèi)存,也能正常的按照類使用,需要注意的是malloc申請內(nèi)存時沒有調(diào)用構(gòu)造函數(shù)

    注意

    博客發(fā)出后有人問我,為什么使用malloc申請的一塊內(nèi)存能夠調(diào)用對象的成員函數(shù),成員函數(shù)不應該是屬于對象的嗎?

    這里說明一下,對象的實現(xiàn)是比C語言里面的類實現(xiàn)復雜了點,但是也沒有想象中的那么復雜,所有類的成員函數(shù)也好,靜態(tài)函數(shù)也好,都和是否創(chuàng)建對象無關,都只有一份。類的成員函數(shù)需要必須需要類對象調(diào)用的原因是因為,成員函數(shù)在調(diào)用的時候必須傳入this指針,你通過lpData調(diào)用成員函數(shù)時,就是把lpData當成this指針傳給SetData等成員函數(shù)了,因此malloc申請的“對象”也能正常調(diào)用類的成員函數(shù)。

    總結(jié)

    以上是生活随笔為你收集整理的为什么`malloc`出来的内存也能当成对象正常使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。