色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

類和動(dòng)態(tài)內(nèi)存分配(一)

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

1. 靜態(tài)類成員函數(shù)

如果將成員函數(shù)聲明為靜態(tài)的(函數(shù)聲明必須包含關(guān)鍵字static,但如果函數(shù)定義是獨(dú)立的,則其中不能包含關(guān)鍵字static),則不能通過對(duì)象調(diào)用靜態(tài)成員函數(shù),且由于靜態(tài)成員函數(shù)不能與特定的對(duì)象相關(guān)聯(lián),因此靜態(tài)成員函數(shù)只能使用靜態(tài)數(shù)據(jù)成員。

2. 在構(gòu)造函數(shù)中使用new時(shí)應(yīng)注意的事項(xiàng)

  • 如果在構(gòu)造函數(shù)中使用new來初始化指針成員,則應(yīng)在析構(gòu)函數(shù)中使用delete
  • new和delete必須相互兼容,new對(duì)應(yīng)delete,new[]對(duì)應(yīng)delete[]。
  • 如果有多個(gè)構(gòu)造函數(shù),則必須以相同的方式使用new,要么都帶,要么都不帶。(因?yàn)橹挥幸粋€(gè)析構(gòu)函數(shù),所有構(gòu)造函數(shù)必須與其兼容)
  • 應(yīng)定義一個(gè)復(fù)制構(gòu)造函數(shù),通過深度復(fù)制將一個(gè)對(duì)象初始化為另外一個(gè)對(duì)象。(具體地說,復(fù)制構(gòu)造函數(shù)應(yīng)分配足夠的空間來存儲(chǔ)復(fù)制的數(shù)據(jù),并復(fù)制數(shù)據(jù),而不僅僅是數(shù)據(jù)的地址,同時(shí),若果有受影響的靜態(tài)成員,要及時(shí)在復(fù)制構(gòu)造函數(shù)中更新該靜態(tài)成員)
  • 應(yīng)當(dāng)定義一個(gè)賦值運(yùn)算符,通過深度復(fù)制一個(gè)對(duì)象給另外一個(gè)對(duì)象。(同時(shí)需要檢查自我賦值的情況,釋放成員指針以前指向的內(nèi)存,復(fù)制數(shù)據(jù)而不僅僅是數(shù)據(jù)的地址,并返回一個(gè)指向調(diào)用對(duì)象的引用)。

3. 有關(guān)函數(shù)返回對(duì)象的說明

當(dāng)成員函數(shù)或獨(dú)立的函數(shù)返回對(duì)象時(shí),常用的方式有:

3.1 返回指向const對(duì)象的引用

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

3.2 返回指向非const對(duì)象的引用

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

3.3 返回對(duì)象

當(dāng)被返回的對(duì)象是被調(diào)用函數(shù)中的局部變量,則應(yīng)該返回對(duì)象。

3.4 返回從const對(duì)象

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

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

4. new與delete

定位new運(yùn)算符能夠讓使用者在分配內(nèi)存時(shí)能夠指定內(nèi)存位置。但這種運(yùn)算符在應(yīng)用于對(duì)象的時(shí)候,應(yīng)該注意:delete可以與常規(guī)的new運(yùn)算符配合使用,但不能與定位new運(yùn)算符配合使用。原因見下例:

// 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運(yùn)算符創(chuàng)建了一個(gè)512字節(jié)的內(nèi)存緩存區(qū),然后在使用new運(yùn)算符在堆中創(chuàng)建兩個(gè)JustTesting對(duì)象。并試圖使用定位new運(yùn)算符在內(nèi)存緩沖區(qū)創(chuàng)建兩個(gè)JustTesting對(duì)象,最后在使用delete來釋放new分配的內(nèi)存時(shí)出現(xiàn)異常,上述代碼的輸出如下:

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

根據(jù)打印信息,很明顯發(fā)現(xiàn)pc1pc3的析構(gòu)函數(shù)未被正常調(diào)用,且pc3在創(chuàng)建的時(shí)候,直接覆蓋了pc1的內(nèi)存。

在使用定位new運(yùn)算符時(shí),要注意一下兩點(diǎn):

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

修改后的代碼:

// 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
    // 顯式銷毀放置的新對(duì)象 
    pc3- >~JustTesting(); // destroy object pointed to by pc3
    pc1- >~JustTesting(); // destroy object pointed to by pc1
    delete[] buffer;     // free buffer
    cout < < "Donen";
    return 0;
}

其對(duì)應(yīng)的輸出:

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

對(duì)于使用定位new運(yùn)算符創(chuàng)建的對(duì)象,由于晚創(chuàng)建的對(duì)象可能依賴于早創(chuàng)建的對(duì)象,所以在刪除時(shí)應(yīng)以與創(chuàng)建順序相反的順序進(jìn)行刪除。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 存儲(chǔ)器
    +關(guān)注

    關(guān)注

    38

    文章

    7527

    瀏覽量

    164168
  • 按位運(yùn)算符
    +關(guān)注

    關(guān)注

    0

    文章

    3

    瀏覽量

    4794
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    動(dòng)態(tài)內(nèi)存管理模塊的設(shè)計(jì)原理與實(shí)現(xiàn)

    Fense 通過設(shè)立個(gè)雙向鏈表(struct Head *stHead)來保存所有被分配動(dòng)態(tài)內(nèi)存塊的信息。鏈表中的每個(gè)節(jié)點(diǎn)對(duì)應(yīng)個(gè)動(dòng)態(tài)內(nèi)存
    的頭像 發(fā)表于 06-30 08:05 ?2388次閱讀
    <b class='flag-5'>動(dòng)態(tài)內(nèi)存</b>管理模塊的設(shè)計(jì)原理與實(shí)現(xiàn)

    C語言知識(shí)總結(jié):動(dòng)態(tài)內(nèi)存分配

    動(dòng)態(tài)內(nèi)存分配就 是指在程序執(zhí)行的過程中動(dòng)態(tài)分配或者回收存儲(chǔ)空間的分配內(nèi)存的方法。
    發(fā)表于 10-24 15:52 ?891次閱讀

    使用C語言實(shí)現(xiàn)簡(jiǎn)單動(dòng)態(tài)內(nèi)存分配

    首先要明白為何需要動(dòng)態(tài)內(nèi)存分配,熟悉C語言的讀者應(yīng)該對(duì)這個(gè)比較熟悉,需要內(nèi)存時(shí)會(huì)使用malloc函數(shù)來申請(qǐng)所需要大小的內(nèi)存,函數(shù)返回
    發(fā)表于 07-28 16:26 ?676次閱讀
    使用C語言實(shí)現(xiàn)簡(jiǎn)單<b class='flag-5'>動(dòng)態(tài)內(nèi)存</b><b class='flag-5'>分配</b>

    C語言程序設(shè)計(jì)中動(dòng)態(tài)內(nèi)存分配如何實(shí)現(xiàn)

    C語言程序設(shè)計(jì)中,動(dòng)態(tài)內(nèi)存分配如何實(shí)現(xiàn),需要注意哪些問題?
    發(fā)表于 09-28 16:53 ?1432次閱讀

    內(nèi)存動(dòng)態(tài)內(nèi)存分配實(shí)現(xiàn)

    第27章 STM32H7的TCM,SRAM等五塊內(nèi)存動(dòng)態(tài)內(nèi)存分配實(shí)現(xiàn)本章教程為大家分享種DTCM,SRAM1,SRAM2,SRAM3和SRAM4可以獨(dú)立管理的
    發(fā)表于 08-03 07:14

    怎樣去定義CDC所需要的動(dòng)態(tài)內(nèi)存分配函數(shù)呢

    為什么使用動(dòng)態(tài)內(nèi)存分配的CDC驅(qū)動(dòng)自動(dòng)生成的代碼不能正常工作呢?怎樣去定義CDC所需要的動(dòng)態(tài)內(nèi)存分配函數(shù)呢?
    發(fā)表于 12-06 07:04

    嵌入式C語言動(dòng)態(tài)內(nèi)存分配

    動(dòng)態(tài)內(nèi)存分配:1、malloc、memset、free在日常寫代碼時(shí)需要注意以下幾點(diǎn):malloc分配內(nèi)存時(shí),需要 if語句 判斷malloc是否成功
    發(fā)表于 12-14 06:37

    請(qǐng)問使用動(dòng)態(tài)內(nèi)存分配安全嗎?

    想在C語言程序員之間開始個(gè)激烈的,或者說有爭(zhēng)議的討論很簡(jiǎn)單,只需要問:“使用動(dòng)態(tài)內(nèi)存分配安全嗎?”使用動(dòng)態(tài)內(nèi)存分配安全嗎?在C語言程序開發(fā)
    發(fā)表于 12-15 06:10

    使用動(dòng)態(tài)內(nèi)存分配安全嗎

    [導(dǎo)讀]想在C語言程序員之間開始個(gè)激烈的,或者說有爭(zhēng)議的討論很簡(jiǎn)單,只需要問:“使用動(dòng)態(tài)內(nèi)存分配安全嗎?”想在C語言程序員之間開始個(gè)激烈的,或者說有爭(zhēng)議的討論很簡(jiǎn)單,只需要問:“使
    發(fā)表于 12-15 07:44

    動(dòng)態(tài)內(nèi)存分配是什么意思

    所謂動(dòng)態(tài)內(nèi)存分配(Dynamic Memory Allocation)就是指在程序執(zhí)行的過程中動(dòng)態(tài)分配或者回收存儲(chǔ)空間的分配
    發(fā)表于 12-17 08:17

    RTThread的動(dòng)態(tài)內(nèi)存空間該如何去分配

    關(guān)于rtt的動(dòng)態(tài)內(nèi)存空間分配,想問下以下我的幾點(diǎn)理解是對(duì)的嗎1、我看RTT NANO和MASTER版本的動(dòng)態(tài)內(nèi)存分配好像不太
    發(fā)表于 08-31 14:34

    動(dòng)態(tài)內(nèi)存錯(cuò)誤的靜態(tài)檢測(cè)

    內(nèi)存泄漏、空指針引用等動(dòng)態(tài)內(nèi)存錯(cuò)誤在/,/LL等支持動(dòng)態(tài)內(nèi)存操作的程序中普遍存在在程序中,動(dòng)態(tài)內(nèi)存管理錯(cuò)誤是導(dǎo)致動(dòng)態(tài)內(nèi)存錯(cuò)誤的根本原因
    發(fā)表于 06-10 16:29 ?52次下載
    <b class='flag-5'>動(dòng)態(tài)內(nèi)存</b>錯(cuò)誤的靜態(tài)檢測(cè)

    嵌入式中需要用到動(dòng)態(tài)內(nèi)存

    所謂動(dòng)態(tài)內(nèi)存分配(Dynamic Memory Allocation)就是指在程序執(zhí)行的過程中動(dòng)態(tài)分配或者回收存儲(chǔ)空間的分配
    的頭像 發(fā)表于 07-27 08:11 ?3087次閱讀

    靜、動(dòng)態(tài)內(nèi)存的優(yōu)劣比較

    動(dòng)態(tài)內(nèi)存分配不像數(shù)組等靜態(tài)內(nèi)存分配方法那樣需要預(yù)先分配存儲(chǔ)空間,而是由系統(tǒng)根據(jù)程序的需要即時(shí)分配
    的頭像 發(fā)表于 08-06 18:25 ?6728次閱讀

    嵌入式C語言中的動(dòng)態(tài)內(nèi)存管理和動(dòng)態(tài)內(nèi)存分配

    動(dòng)態(tài)內(nèi)存管理同時(shí)還具有個(gè)優(yōu)點(diǎn):當(dāng)程序在具有更多內(nèi)存的系統(tǒng)上需要處理更多數(shù)據(jù)時(shí),不需要重寫程序。
    發(fā)表于 08-15 17:16 ?2306次閱讀
    主站蜘蛛池模板: 男男女女爽爽爽视频免费| 麻豆狠色伊人亚洲综合网站| 99精品免费在线观看| 一个人免费观看在线视频播放| 桃色园社区| 涩涩电影网| 日韩丰满少妇无码内射| 青青草伊人网| 青青草原直播| 欧洲精品不卡1卡2卡三卡四卡| 男人插曲视频大全免费网站| 两个奶头被吃得又翘又痛| 久久亚洲精品无码A片大香大香| 交换娇妻呻吟声不停中文字幕| 国产一卡2卡3卡4卡孕妇网站| 国产剧果冻传媒星空在线观看 | 久久久久久极精品久久久| 国内精品久久久久影院网站 | YELLOW免费观看2019| 99re久久热在线播放快| ava云直播| 菠萝菠萝蜜在线观看视频| 波野结衣qvod| 国产成人ae在线观看网站站| 国产成人精品视频| 国产精品亚洲专一区二区三区 | 丝袜美腿美女被狂躁在线观看| 翁公吮她的花蒂和奶水| 午夜影院费试看黄| 亚洲AV香蕉一区区二区三区蜜桃| 国产香蕉视频| 亚洲色大成网站www久久九九| 亚洲视频在线免费观看| 国产精品第八页| 国产成人精品免费视频大全办公室| 大陆午夜伦理| 扒开粉嫩的小缝末成年小美女| 纯肉高H啪短文合集| 国产成人啪精视频精东传媒网站 | 果冻传媒独家原创在线观看| 免费。色婬网站|