c++:動態內存變量

典型的C++面向對象編程

元素
(1)頭文件hpp中類的定義
(2)源文件cpp中類的實現(構造函數、析構函數、方法)
(3)主程序

案例
(1)用C++來編程“人一天的生活”
(2)“人”的屬性:name、age、male
(3)“人”的方法:eat、work(coding/shopping)、sleep
(4)人的生活:eat1->work->eat2->work->sleep
實戰中,一般一個cpp和一個hpp文件配對,描述一個class,class的名字和文件名相同的。
.h 文件

namespace MAN{
class testperson {public://屬性string name;int age;bool male;  //性別 男性 ture//方法void eat(void);void work(void);void sleep(void);testperson(/* args */);~testperson();
};

.c 文件

using namespace MAN;
testperson::testperson(/* args */) {}testperson::~testperson() {}void testperson::eat(void) { cout << this->name << "-eat" << endl; }
void testperson::work(void) {if (this->male == 1) {cout << name << "-coding" << endl;} else {cout << name << "-shopping" << endl;}
}
void testperson::sleep(void) { cout << name << "-sleep" << endl; }int test() {testperson xioahong;  //局部變量 分配在棧上testperson *xiaoming =new testperson();  // 動態內存 分配在自由內存空間,其實就是對堆上// 自己管理內存xiaoming->name = "jiajia";xiaoming->age = 99;xiaoming->male = true;xiaoming->eat();xiaoming->work();xiaoming->eat();xiaoming->work();xiaoming->sleep();return 0;
}

代碼:

testperson xiaoming = new testperson();

報錯:

error: conversion from ‘testperson*’ to non-scalar type ‘testperson’
requested 1071 | new testperson();version from ‘testperson*’ to
non-scalar type ‘testperson’ requested 1071 | new testperson();

修改:

testperson *xiaoming = new testperson();

  • C++面向對象式編程總結
    (1)整個工作分為2大塊:一個是建模和編寫類庫,一個是使用類庫來編寫主程序完成任務。
    (2)有些人只負責建模和編寫類庫,譬如開發opencv的人。
    (3)有些人直接調用現成類庫來編寫自己的主任務程序,譬如使用opencv分析一張圖片中有沒有電動車
    (4)難度上不確定,2個都可能很難或者很簡單。

  • C++學習的三重境界
    (1)學習C++第一重境界就是語法層面,先學會如何利用C++來建模、來編程,學習語法時先別解決難度大問題。
    (2)學習C++第二重境界是解決問題層面,學習如果理解并調用現成類庫來編寫主程序解決問題。
    (3)學習C++第三重境界是編寫類庫和sample給別人用,需要基礎好且有一定架構思維。

在構造和析構函數中使用動態內存

析構函數的使用
(1)析構函數在對象對銷毀時自動調用,一般有2種情況
(2)用new分配的對象,用delete顯式析構
(3)分配在棧上的對象,當棧釋放時自動析構
(4)普通情況下析構函數都是空的,因為不必做什么特別的事情

class testperson {public://屬性string name;int age;bool male;  //性別 男性 ture//方法void eat(void);void work(void);void sleep(void);testperson(/* args */);~testperson();
};
testperson::testperson(/* args */) { cout << name << "1" << endl; }testperson::~testperson() { cout << name << "2" << endl; }void testperson::eat(void) { cout << this->name << "-eat" << endl; }
void testperson::work(void) {if (this->male == 1) {cout << name << "-coding" << endl;} else {cout << name << "-shopping" << endl;}
}
void testperson::sleep(void) { cout << name << "-sleep" << endl; }int test0625006() {testperson *xiaohong1 =new testperson();  // 動態內存 分配在自由內存空間,其實就是對堆上// 自己管理內存xiaohong1->name = "jiajia";xiaohong1->age = 99;xiaohong1->male = true;xiaohong1->eat();xiaohong1->work();xiaohong1->eat();xiaohong1->work();xiaohong1->sleep();delete xiaohong1;  //添加才會執行析構函數testperson xiaohong;  //局部變量 分配在棧上xiaohong.name = "meimei";xiaohong.age = 99;xiaohong.male = true;xiaohong.eat();xiaohong.work();xiaohong.eat();xiaohong.work();xiaohong.sleep();return 0;
}
  • 在class中使用動態內存變量
    (1)什么情況下用動態內存?需要大塊內存,且需要按需靈活的申請和釋放,用棧怕爆、用全局怕浪費和死板時
    (2)在class person中增加一個int *指針,用于指向一個int類型元素的內存空間
    (3)在構造函數中分配動態內存
    (4)在析構函數中回收動態內存
    (5)將動態內存從int變量升級到int數組變量
    (6)實戰中C++常用的動態內存往往是容器vector那些,課程第3部分會講到
class testperson {public://屬性string name;int age;bool male;  //性別 男性 tureint *pint;//方法void eat(void);void work(void);void sleep(void);testperson(/* args */);~testperson();
};
testperson::testperson(/* args */) {this->pint = new int(99);//分配、初始化cout << name << "1" << endl;
}testperson::~testperson() {cout << name << "2" << endl;delete this->pint;//回收
}void testperson::eat(void) { cout << this->name << "-eat" << endl; }
void testperson::work(void) {if (this->male == 1) {cout << name << "-coding" << endl;} else {cout << name << "-shopping" << endl;}cout << "this->pint:" << *(this->pint)  << endl;//使用
}
void testperson::sleep(void) { cout << name << "-sleep" << endl; }int test0625006() {testperson *xiaohong1 =new testperson();  // 動態內存 分配在自由內存空間,其實就是對堆上// 自己管理內存xiaohong1->name = "jiajia";xiaohong1->age = 99;xiaohong1->male = true;xiaohong1->eat();xiaohong1->work();xiaohong1->eat();xiaohong1->work();xiaohong1->sleep();delete xiaohong1;  //添加才會執行析構函數testperson xiaohong;  //局部變量 分配在棧上xiaohong.name = "meimei";xiaohong.age = 99;xiaohong.male = true;xiaohong.eat();xiaohong.work();xiaohong.eat();xiaohong.work();xiaohong.sleep();return 0;
}

申請更多的空間

class testperson {public://屬性string name;int age;bool male;  //性別 男性 tureint *pint;char *pchar;//方法void eat(void);void work(void);void sleep(void);testperson(/* args */);~testperson();
};
testperson::testperson(/* args */) {this->pint = new int(99);     //分配、初始化this->pchar = new char[20];  //分配、初始化cout << name << "1" << endl;
}testperson::~testperson() {cout << name << "2" << endl;delete this->pint;   //回收delete[] this->pchar;  //回收
}void testperson::eat(void) { cout << this->name << "-eat" << endl; }
void testperson::work(void) {if (this->male == 1) {cout << name << "-coding" << endl;} else {cout << name << "-shopping" << endl;}cout << "this->pint:" << *(this->pint) << endl;  //使用for (size_t i = 0; i < 20; i++) {*(this->pchar) = 'a'+ i;cout << "this->pchar:" << *(this->pchar) << endl;  //使用}
}
void testperson::sleep(void) { cout << name << "-sleep" << endl; }int test0625006() {testperson *xiaohong1 =new testperson();  // 動態內存 分配在自由內存空間,其實就是對堆上// 自己管理內存xiaohong1->name = "jiajia";xiaohong1->age = 99;xiaohong1->male = true;xiaohong1->eat();xiaohong1->work();xiaohong1->eat();xiaohong1->work();xiaohong1->sleep();delete xiaohong1;  //添加才會執行析構函數testperson xiaohong;  //局部變量 分配在棧上xiaohong.name = "meimei";xiaohong.age = 99;xiaohong.male = true;xiaohong.eat();xiaohong.work();xiaohong.eat();xiaohong.work();xiaohong.sleep();return 0;
}

在這里插入圖片描述

用valgrind工具查看內存泄漏
(1)valgrind工具介紹:參考:https://blog.csdn.net/u012662731/article/details/78652651
(2)安裝:

sudo apt-get install valgrind

(ubuntu16.04 X64)sudo apt-get install valgrind
(3)編譯程序:主要是添加-g參數便于調試時有行號 g++ person.cpp main.cpp -g -o apptest
(4)使用:valgrind --tool=memcheck --leak-check=full --show-reachable=yes --trace-children=yes ./app

  • valgrind和Cmake工程結合
    1、在CMakeLists.txt文件添加
SET(CMAKE_BUILD_TYPE "Debug")

2、使用下面語句生成了日志3_g,將test換成你自己的工程名稱

valgrind --leak-check=yes --log-file=3_g ./build/test

總結:

學會分文件創建一個類,并且使用起來
學會使用valgrind查看日志

學習記錄,侵權聯系刪除。
來源:朱老師物聯網大課堂

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/40751.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/40751.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/40751.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【網絡安全學習】漏洞利用:BurpSuite的使用-03-枚舉攻擊案例

如何使用BurpSuite進行枚舉攻擊 1.靶場選擇 BurpSuite官方也是有滲透的教學與靶場的&#xff0c;這次就使用BurpSuite的靶場進行練習。 靶場地址&#xff1a;https://portswigger.net/web-security 登錄后如下圖所示&#xff0c;選擇**【VIEW ALL PATHS】**&#xff1a; 找…

PHP基礎教程——總結W3school

1、<?php ?> 2、$ 聲明變量 3、變量大小寫敏感 關鍵字&#xff08;if、else、echo&#xff09;和用戶定義的類、函數大小寫不敏感 4、三種注釋 // # /* */ 5、echo "<br>"; 換行 6、global(關鍵字) 函數內訪問全局變量 $GLOBALS[index] …

經典鏈表算法題:找到環的入口。清晰圖示推導出來

Leetcode題目鏈接 原理 重畫鏈表如下所示&#xff0c;線上有若干個節點。記藍色慢指針為 slow&#xff0c;紅色快指針為 fast。初始時 slow 和 fast 均在頭節點處。 使 slow 和 fast 同時前進&#xff0c;fast 的速度是 slow 的兩倍。當 slow 抵達環的入口處時&#xff0c;如…

FFmpeg引用計數數據緩沖區相關的結構體:AVBuffer、AVBufferRef簡介

一、AVBuffer結構體的聲明 AVBuffer是一個用于引用計數數據緩沖區的應用程序編程接口&#xff0c;它表示數據緩沖區本身。它是不透明的&#xff0c;不能被直接訪問調用&#xff0c;只能通過AVBufferRef間接訪問它。但是可以通過比較兩個AVBuffer指針來檢查是否兩個不同的引用都…

MySQL——三大范式

為什么需要數據規范化&#xff1f; 信息重復 更新異常 插入異常&#xff1a;無法正常顯示信息 刪除異常&#xff1a;丟失有效的信息 三大范式 1. 第一范式&#xff08;1NF&#xff09; 原子性&#xff1a;保證每一列不可再分 2. 第二范式&#xff08;2NF&#xf…

【公益案例展】四川農擔x中電金信——大數據智能風控平臺建設

? 中電金信公益案例 本項目案例由中電金信投遞并參與數據猿與上海大數據聯盟聯合推出的 #榜樣的力量# 《2024中國數據智能產業最具社會責任感企業》榜單/獎項”評選。 大數據產業創新服務媒體 ——聚焦數據 改變商業 1、外部經濟環境帶來的挑戰 近幾年經濟發展和市場需求的挑…

【C語言】—— 文件操作(下)

【C語言】—— 文件操作&#xff08;下&#xff09; 前言&#xff1a;五、文件的順序讀寫5.1、 順序讀寫函數介紹5.2、 f p u t c fputc fputc 函數5.3、 f g e t c fgetc fgetc 函數5.4、 f p u t s fputs fputs 函數5.5、 f g e t s fgets fgets 函數5.6、 f p r i n t f…

2024 年 亞太賽 APMCM (C題)中文賽道國際大學生數學建模挑戰賽 | 量子計算的物流配送 | 數學建模完整代碼+建模過程全解全析

當大家面臨著復雜的數學建模問題時&#xff0c;你是否曾經感到茫然無措&#xff1f;作為2022年美國大學生數學建模比賽的O獎得主&#xff0c;我為大家提供了一套優秀的解題思路&#xff0c;讓你輕松應對各種難題&#xff01; 完整內容可以在文章末尾領取&#xff01; 該段文字…

C++內存管理(候捷)第一講 筆記

內存分配的每一層面 applications可以調用STL&#xff0c;里面會有allocator進行內存分配&#xff1b;也可以使用C 基本工具primitives&#xff0c;比如new, new[], new(), ::operator new()&#xff1b;還可以使用更底層的malloc和free分配和釋放內存。最底層的是系統調用&…

實現好友關注功能的Feed流設計

摘要 在社交網絡應用中&#xff0c;Feed流是展示好友動態的核心功能。本文將探討如何設計一個Feed流系統&#xff0c;以實現好友關注和動態展示的功能。 1. Feed流的基本概念 Feed流是用戶在社交網絡中獲取信息的一種方式&#xff0c;通常按照時間順序展示好友或感興趣的用戶…

Maven Archetype 自定義項目模板:高效開發的最佳實踐

文章目錄 前言一、Maven Archetype二、創建自定義 Maven Archetype三、定制 Archetype 模板四、手動創建 Archetype 模板項目五、FAQ5.1 如何刪除自定義的模板5.2 是否可以在模板中使用空文件夾 六、小結推薦閱讀 前言 在軟件開發中&#xff0c;標準化和快速初始化項目結構能夠…

調用asyncio.to_thread后上下文依然一致嗎

使用Python的asyncio時&#xff0c;可以把一個同步的函數放到線程池中執行從而避免這個函數阻塞asyncio自身的事件循環。比如可以把requests庫的請求放進去 async def to_thread_do_request(url):return await asyncio.to_thread(requests.get, url)這個to_thread_do_request方…

14-20 Vision Transformer用AI的畫筆描繪新世界

概述 毫無疑問,目前最受關注且不斷發展的最重要的主題之一是使用人工智能生成圖像、視頻和文本。大型語言模型 (LLM) 已展示出其在文本生成方面的卓越能力。它們在文本生成方面的許多問題已得到解決。然而,LLM 面臨的一個主要挑戰是它們有時會產生幻覺反應。 最近推出的新模…

分布式計算、異構計算與算力共享

目錄 算力 算力共享的技術支撐 云計算技術 邊緣計算技術 區塊鏈技術 分布式計算、異構計算與算力共享 分布式計算:計算力的“集團軍作戰” 異構計算:計算力的“多兵種協同” 算力共享:計算力的“共享經濟” 深入融合,共創計算新紀元 算力共享對科研領域的影響 …

openmetadata1.3.1 自定義連接器 開發教程

openmetadata自定義連接器開發教程 一、開發通用自定義連接器教程 官網教程鏈接&#xff1a; 1.https://docs.open-metadata.org/v1.3.x/connectors/custom-connectors 2.https://github.com/open-metadata/openmetadata-demo/tree/main/custom-connector &#xff08;一&…

Matplotlib 文本

可以使用 xlabel、ylabel、text向圖中添加文本 mu, sigma 100, 15 x mu sigma * np.random.randn(10000)# the histogram of the data n, bins, patches plt.hist(x, 50, densityTrue, facecolorg, alpha0.75)plt.xlabel(Smarts) plt.ylabel(Probability) plt.title(Histo…

Qt讀取ini格式配置文件的類設計

目錄 1.引言 2.QSettings 2.1.功能特點 2.2.基本用法 3.讀取ini文件配置通用類設計 3.1.設計要點 3.2.完整實現 3.3.調用方法 4.總結 1.引言 在編寫應用程序的時&#xff0c;有些參數需要用戶配置&#xff0c;那么這些參數就涉及到存儲了&#xff0c;單從存儲來講&…

git 還原被刪除的分支

在多人項目開發中&#xff0c;有一次碰到忘記合并到master分支了&#xff0c;直接就把開發分支給刪除了&#xff0c;現在記錄下怎么還原被刪除的分支 必須保證刪除的分支之前已經被推送到了遠程倉庫 # 找出被刪除分支的最后一個提交的哈希值 git reflog show# 找到提交哈希值…

2024/07/04

1、梳理筆記(原創) 2、終端輸入一個日期&#xff0c;判斷是這一年的第幾天 scanf("%d-%d-%d",&y,&m,&d); 閏年2月29天&#xff0c;平年2月28天 #include<stdio.h> int main(int argc, char const *argv[]) {int y0,m0,d0;printf("please ente…

析構函數和拷貝構造函數

文章目錄 析構函數1.析構函數的定義&#xff1a;2.析構函數的語法&#xff1a;3.析構函數的特性&#xff1a; 拷貝構造函數1.拷貝構造函數的定義&#xff1a;2.拷貝構造函數的語法3.拷貝構造函數的特性(1)拷貝構造函數是構造函數的一個重載形式**(這個其實也很好理解&#xff0…