在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

類和動態內存分配(一)

冬至配餃子 ? 來源:iDoitnow ? 作者:艱默 ? 2023-07-18 10:45 ? 次閱讀

1. 靜態類成員函數

如果將成員函數聲明為靜態的(函數聲明必須包含關鍵字static,但如果函數定義是獨立的,則其中不能包含關鍵字static),則不能通過對象調用靜態成員函數,且由于靜態成員函數不能與特定的對象相關聯,因此靜態成員函數只能使用靜態數據成員。

2. 在構造函數中使用new時應注意的事項

  • 如果在構造函數中使用new來初始化指針成員,則應在析構函數中使用delete。
  • new和delete必須相互兼容,new對應delete,new[]對應delete[]。
  • 如果有多個構造函數,則必須以相同的方式使用new,要么都帶,要么都不帶。(因為只有一個析構函數,所有構造函數必須與其兼容)
  • 應定義一個復制構造函數,通過深度復制將一個對象初始化為另外一個對象。(具體地說,復制構造函數應分配足夠的空間來存儲復制的數據,并復制數據,而不僅僅是數據的地址,同時,若果有受影響的靜態成員,要及時在復制構造函數中更新該靜態成員)
  • 應當定義一個賦值運算符,通過深度復制一個對象給另外一個對象。(同時需要檢查自我賦值的情況,釋放成員指針以前指向的內存,復制數據而不僅僅是數據的地址,并返回一個指向調用對象的引用)。

3. 有關函數返回對象的說明

當成員函數或獨立的函數返回對象時,常用的方式有:

3.1 返回指向const對象的引用

使用const引用的主要原因是為了提高效率,但該方式存在一定的限制。如果函數返回(通過調用對象的方法或將對象作為參數)傳遞給它的對象,可以通過返回引用來提高效率。

3.2 返回指向非const對象的引用

兩種常見的返回非const對象情形是,重載賦值運算符以及重載與cout一起使用的<<運算符。前者這樣做是為了提高效率,而后者必須這么做。

3.3 返回對象

當被返回的對象是被調用函數中的局部變量,則應該返回對象。

3.4 返回從const對象

返回const對象可以避免類似force1 + force2 = net這種奇異屬性誤用可能帶來的錯誤。

總的來說,如果方法或函數要返回局部對象,則應該返回對象。如果方法或函數要返回一個沒有公有復制構造函數的類(如ostream類)的對象,則必須返回一個指向這個對象的引用。如果方法或函數可以返回對象,也可以返回對象的引用,則優先選擇引用,提高效率。

4. new與delete

定位new運算符能夠讓使用者在分配內存時能夠指定內存位置。但這種運算符在應用于對象的時候,應該注意:delete可以與常規的new運算符配合使用,但不能與定位new運算符配合使用。原因見下例:

// placenew1.cpp -- new, placement new, no delete
#include < iostream >
#include < new >
#include < string >
using namespace std;
const int BUF = 512;
class JustTesting
{
private:
    string words;
    int number;

public:
    JustTesting(const string &s = "Just Testing", int n = 0)
    {
        words = s;
        number = n;
        cout < < words < < " constructedn";
    }
    ~JustTesting() { cout < < words < < " destroyedn"; }
    void Show() const { cout < < words < < ", " < < number < < endl; }
};
int main()
{
    char *buffer = new char[BUF]; // get a block of memory
    JustTesting *pc1, *pc2;
    pc1 = new (buffer) JustTesting;     // place object in buffer
    pc2 = new JustTesting("Heap1", 20); // place object on heap
    cout < < "Memory block addresses:n"
         < < "buffer: "
         < < (void *)buffer < < " heap: " < < pc2 < < endl;
    cout < < "Memory contents:n";
    cout < < pc1 < < ": ";
    pc1- >Show();
    cout < < pc2 < < ": ";
    pc2- >Show();
    JustTesting *pc3, *pc4;
    pc3 = new (buffer) JustTesting("Bad Idea", 6);
    pc4 = new JustTesting("Heap2", 10);
    cout < < "Memory contents:n";
    cout < < pc3 < < ": ";
    pc3- >Show();
    cout < < pc4 < < ": ";
    pc4- >Show();
    delete pc2;      // free Heap1
    delete pc4;      // free Heap2
    delete[] buffer; // free buffer
    cout < < "Donen";
    return 0;
}

其中,使用new運算符創建了一個512字節的內存緩存區,然后在使用new運算符在堆中創建兩個JustTesting對象。并試圖使用定位new運算符在內存緩沖區創建兩個JustTesting對象,最后在使用delete來釋放new分配的內存時出現異常,上述代碼的輸出如下:

Just Testing constructed
Heap1 constructed
Memory block addresses:
buffer: 00320AB0 heap: 00320CE0
Memory contents:
00320AB0: Just Testing, 0
00320CE0: Heap1, 20
Bad Idea constructed
Heap2 constructed
Memory contents:
00320AB0: Bad Idea, 6
00320EC8: Heap2, 10
Heap1 destroyed
Heap2 destroyed
Done

根據打印信息,很明顯發現pc1pc3的析構函數未被正常調用,且pc3在創建的時候,直接覆蓋了pc1的內存。

在使用定位new運算符時,要注意一下兩點:

  • 要保證每個對象要使用不同的內存單元(即需要提供兩個不同的內存地址,并確保兩個內存單元不存在重疊)。
  • 如果使用定位new運算符來為對象分配內存,必須保證其析構函數能夠正常的被調用(delete可以和常規的new運算符配合使用,但不能與定位new運算符配合使用,因此,delete對于定位new運算符對其分配內存做了什么一無所知)。

修改后的代碼:

// placenew2.cpp -- new, placement new, no delete
#include < iostream >
#include < new >
#include < string >
using namespace std;
const int BUF = 512;
class JustTesting
{
private:
    string words;
    int number;

public:
    JustTesting(const string &s = "Just Testing", int n = 0)
    {
        words = s;
        number = n;
        cout < < words < < " constructedn";
    }
    ~JustTesting() { cout < < words < < " destroyedn"; }
    void Show() const { cout < < words < < ", " < < number < < endl; }
};
int main()
{
    char *buffer = new char[BUF]; // get a block of memory
    JustTesting *pc1, *pc2;
    pc1 = new (buffer) JustTesting;     // place object in buffer
    pc2 = new JustTesting("Heap1", 20); // place object on heap
    cout < < "Memory block addresses:n"
         < < "buffer: "
         < < (void *)buffer < < " heap: " < < pc2 < < endl;
    cout < < "Memory contents:n";
    cout < < pc1 < < ": ";
    pc1- >Show();
    cout < < pc2 < < ": ";
    pc2- >Show();
    JustTesting *pc3, *pc4;
    // fix placement new location
    pc3 = new (buffer + sizeof(JustTesting))
        JustTesting("Better Idea", 6);
    pc4 = new JustTesting("Heap2", 10);
    cout < < "Memory contents:n";
    cout < < pc3 < < ": ";
    pc3- >Show();
    cout < < pc4 < < ": ";
    pc4- >Show();
    delete pc2; // free Heap1
    delete pc4; // free Heap2
    // 顯式銷毀放置的新對象 
    pc3- >~JustTesting(); // destroy object pointed to by pc3
    pc1- >~JustTesting(); // destroy object pointed to by pc1
    delete[] buffer;     // free buffer
    cout < < "Donen";
    return 0;
}

其對應的輸出:

Just Testing constructed
Heap1 constructed
Memory block addresses:
buffer: 00320AB0 heap: 00320CE0
Memory contents:
00320AB0: Just Testing, 0
00320CE0: Heap1, 20
Better Idea constructed
Heap2 constructed
Memory contents:
00320AD0: Better Idea, 6
00320EC8: Heap2, 10
Heap1 destroyed
Heap2 destroyed
Better Idea destroyed
Just Testing destroyed
Done

對于使用定位new運算符創建的對象,由于晚創建的對象可能依賴于早創建的對象,所以在刪除時應以與創建順序相反的順序進行刪除。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 存儲器
    +關注

    關注

    38

    文章

    7518

    瀏覽量

    164083
  • 按位運算符
    +關注

    關注

    0

    文章

    3

    瀏覽量

    4794
收藏 人收藏

    評論

    相關推薦

    動態內存管理模塊的設計原理與實現

    Fense 通過設立個雙向鏈表(struct Head *stHead)來保存所有被分配動態內存塊的信息。鏈表中的每個節點對應動態內存
    的頭像 發表于 06-30 08:05 ?2378次閱讀
    <b class='flag-5'>動態內存</b>管理模塊的設計原理與實現

    C語言知識總結:動態內存分配

    動態內存分配就 是指在程序執行的過程中動態分配或者回收存儲空間的分配內存的方法。
    發表于 10-24 15:52 ?876次閱讀

    使用C語言實現簡單動態內存分配

    首先要明白為何需要動態內存分配,熟悉C語言的讀者應該對這個比較熟悉,需要內存時會使用malloc函數來申請所需要大小的內存,函數返回
    發表于 07-28 16:26 ?668次閱讀
    使用C語言實現簡單<b class='flag-5'>動態內存</b><b class='flag-5'>分配</b>

    C語言程序設計中動態內存分配如何實現

    C語言程序設計中,動態內存分配如何實現,需要注意哪些問題?
    發表于 09-28 16:53 ?1414次閱讀

    內存動態內存分配實現

    第27章 STM32H7的TCM,SRAM等五塊內存動態內存分配實現本章教程為大家分享種DTCM,SRAM1,SRAM2,SRAM3和SRAM4可以獨立管理的
    發表于 08-03 07:14

    怎樣去定義CDC所需要的動態內存分配函數呢

    為什么使用動態內存分配的CDC驅動自動生成的代碼不能正常工作呢?怎樣去定義CDC所需要的動態內存分配函數呢?
    發表于 12-06 07:04

    嵌入式C語言動態內存分配

    動態內存分配:1、malloc、memset、free在日常寫代碼時需要注意以下幾點:malloc分配內存時,需要 if語句 判斷malloc是否成功
    發表于 12-14 06:37

    請問使用動態內存分配安全嗎?

    想在C語言程序員之間開始個激烈的,或者說有爭議的討論很簡單,只需要問:“使用動態內存分配安全嗎?”使用動態內存分配安全嗎?在C語言程序開發
    發表于 12-15 06:10

    使用動態內存分配安全嗎

    [導讀]想在C語言程序員之間開始個激烈的,或者說有爭議的討論很簡單,只需要問:“使用動態內存分配安全嗎?”想在C語言程序員之間開始個激烈的,或者說有爭議的討論很簡單,只需要問:“使
    發表于 12-15 07:44

    動態內存分配是什么意思

    所謂動態內存分配(Dynamic Memory Allocation)就是指在程序執行的過程中動態分配或者回收存儲空間的分配
    發表于 12-17 08:17

    RTThread的動態內存空間該如何去分配

    關于rtt的動態內存空間分配,想問下以下我的幾點理解是對的嗎1、我看RTT NANO和MASTER版本的動態內存分配好像不太
    發表于 08-31 14:34

    動態內存錯誤的靜態檢測

    內存泄漏、空指針引用等動態內存錯誤在/,/LL等支持動態內存操作的程序中普遍存在在程序中,動態內存管理錯誤是導致動態內存錯誤的根本原因
    發表于 06-10 16:29 ?52次下載
    <b class='flag-5'>動態內存</b>錯誤的靜態檢測

    嵌入式中需要用到動態內存

    所謂動態內存分配(Dynamic Memory Allocation)就是指在程序執行的過程中動態分配或者回收存儲空間的分配
    的頭像 發表于 07-27 08:11 ?3079次閱讀

    靜、動態內存的優劣比較

    動態內存分配不像數組等靜態內存分配方法那樣需要預先分配存儲空間,而是由系統根據程序的需要即時分配
    的頭像 發表于 08-06 18:25 ?6716次閱讀

    嵌入式C語言中的動態內存管理和動態內存分配

    動態內存管理同時還具有個優點:當程序在具有更多內存的系統上需要處理更多數據時,不需要重寫程序。
    發表于 08-15 17:16 ?2298次閱讀
    主站蜘蛛池模板: 国产精品午夜免费观看网站| 免费日韩一级片| 奇米视频7777| 黄色亚洲| 色婷婷资源网| 手机看片福利日韩| 国产亚洲欧洲人人网| 日韩欧美中文字幕在线播放| 激情久久久久久久久久久| 久草在线资源网| 天天综合网天天综合色| 国产香港三级理论在线| 国产69精品久久久久9999| 你懂的在线观看网站| 三级电影在线观看视频| 一级做a爰片久久毛片免费| 一道精品视频一区二区三区男同| 国产一区二区在线不卡| 日本黄色影片| 亚洲 欧美 中文字幕| 伊人色强在线网| 国产美女作爱全过程免费视频| 免费任我爽橹视频在线观看| 天天天天天天干| 免费一看一级毛片全播放| 成年人午夜影院| 黄乱色伦短篇小说h| 久久久久国产精品免费看| 五月天色丁香| 免费看污视频的网站| 亚洲不卡视频| 怡红院网址| 欧洲性freefree大白屁股| 人人干人人草| 国内真实实拍伦视频在线观看| 爱爱免费小视频| www.四虎影院.con| 国产嫩草影院在线观看| 国产永久视频夜色资源网| 一级特色黄大片| 午夜美女影院|