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.rhkb.cn/news/368578.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【虚拟机】虚拟机网络无法访问问题【已解决】

【虚拟机】虚拟机无法上网问题【已解决】 问题探究解决方法法1&#xff1a;查看相关“网络服务”是否处于正常启动状态法2&#xff1a;重启网络法3&#xff1a;重新安装VMWare法4&#xff1a;使用NAT模式&#xff0c;每次打开win7都没连上网的解决办法 问题探究 安装了很多个虚…

香橙派 AIpro 根据心情生成专属音乐

香橙派 AIpro 根据心情生成专属音乐 一、OrangePi AI pro 开发版参数介绍1.1 接口简介1.2 OrangePi AI pro 的Linux系统功能适配情况1.3 开发板开机1.4 远程连接到 OrangePi AIpro 二、开发环境搭建2.1 创建环境、代码部署文件夹2.2 安装 miniconda2.3 为 miniconda 更新国内源…

分子AI预测赛笔记

#AI夏令营 #Datawhale #夏令营 Taks1 跑通baseline 根据task1跑通baseline 注册账号 直接注册或登录百度账号&#xff0c;etc fork 项目 零基础入门 Ai 数据挖掘竞赛-速通 Baseline - 飞桨AI Studio星河社区 启动项目 选择运行环境&#xff0c;并点击确定&#xff0c;没…

Redis的八种数据类型介绍

Redis 是一个高性能的键值存储&#xff0c;它支持多种丰富的数据类型。每种数据类型都有其特定的用途和底层实现。下面我将介绍 Redis 支持的主要数据类型及其背后的数据结构。 本人这里还有几篇详细的Redis用法文章&#xff0c;可以用来进阶康康&#xff01; 1. 字符串 (Stri…

轻松跨越国界:使用WildCard畅享全球AI服务

大家好&#xff0c;现在AI技术已经深入到我们的日常生活中。然而&#xff0c;许多朋友仍然难以获取优质的AI工具和应用。那么&#xff0c;如何才能使用像ChatGPT这样的AI服务呢&#xff1f; 今天我为大家介绍一个“一劳永逸”的解决方案&#xff0c;它就是我们的主角——WildC…

基于antv x6实现的组织架构图

X6 是基于 HTML 和 SVG 的图编辑引擎&#xff0c;基于 MVC 架构&#xff0c;用户更加专注于数据逻辑和业务逻辑。 一、业务背景 将组织树形结构图形化&#xff0c;更直观的展示个人所在的组织架构。 二、功能点 组织结构按需渲染&#xff0c;支持层级展开、收缩按需求自定义…

秋招突击——设计模式补充——单例模式、依赖倒转原则、工厂方法模式

文章目录 引言正文依赖倒转原则工厂方法模式工厂模式的实现简单工厂和工厂方法的对比 抽线工厂模式最基本的数据访问程序使用工厂模式实现数据库的访问使用抽象工厂模式的数据访问程序抽象工厂模式的优点和缺点使用反射抽象工厂的数据访问程序使用反射配置文件实现数据访问程序…

PhysioLLM 个性化健康洞察:手表可穿戴设备实时数据 + 大模型

个性化健康洞察&#xff1a;可穿戴设备实时数据 大模型 提出背景PhysioLLM 图PhysioLLM 实现数据准备用户模型和洞察生成个性化数据总结和洞察是如何生成的&#xff1f; 解析分析 提出背景 论文&#xff1a;https://arxiv.org/pdf/2406.19283 虽然当前的可穿戴设备伴随应用&…

S272钡铼技术4G无线RTU支持多路DIN输入和模拟量转换至4G网络

钡铼第四代RTU S272是一款先进的工业级4G远程遥测终端&#xff0c;为各种远程工业数据采集和控制系统提供了高效解决方案。结合了现代通信技术和多功能的输入输出接口&#xff0c;S272不仅支持多路数字量和模拟量输入&#xff0c;还具备灵活的扩展性和强大的控制功能&#xff0…

什么是嵌入式,单片机又是什么,两者有什么关联又有什么区别?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「嵌入式的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;从科普的角度&#xff0c;…

Python酷库之旅-第三方库Pandas(001)

目录 一、Pandas库的由来 1、背景与起源 1-1、开发背景 1-2、起源时间 2、名称由来 3、发展历程 4、功能与特点 4-1、数据结构 4-2、数据处理能力 5、影响与地位 5-1、数据分析“三剑客”之一 5-2、社区支持 二、Pandas库的应用场景 1、数据分析 2、数据清洗 3…

记录OSPF配置,建立邻居失败的过程

1.配置完ospf后&#xff0c;在路由表中不出现ospf相关信息 [SW2]ospf [SW2-ospf-1]are [SW2-ospf-1]area 0 [SW2-ospf-1-area-0.0.0.0]net [SW2-ospf-1-area-0.0.0.0]network 0.0.0.0 Jul 4 2024 22:11:58-08:00 SW2 DS/4/DATASYNC_CFGCHANGE:OID 1.3.6.1.4.1.2011.5.25 .1…

二分查找及其变种

一、概念 二分查找算法&#xff08;Binary Search Algorithm&#xff09;是一种在有序数组中查找特定元素的高效搜索方法。 其基本思想是将目标值与数组中间的元素进行比较&#xff0c;如果目标值等于中间元素&#xff0c;则查找成功&#xff1b;如果目标值小于中间元素&…

Visual Studio 设置回车代码补全

工具 -> 选项 -> 文本编辑器 -> C/C -> 高级 -> 主动提交成员列表 设置为TRUE

使用EndNote在Word中插入参考文献,并编辑参考文献样式方法

一、背景 在准备中期报告时&#xff0c;学校给的是Word模板&#xff0c;习惯了Latex排版和添加参考文献的便利后&#xff0c;真不想用word写东西。 之前投《机器人》期刊&#xff08;被拒了&#xff09;和准备开题的时候也是用word写的&#xff0c;当时为方便添加参考文献和定…

【人工智能】--生成对抗网络

个人主页&#xff1a;欢迎来到 Papicatch的博客 课设专栏 &#xff1a;学生成绩管理系统 专业知识专栏&#xff1a; 专业知识 文章目录 &#x1f349;引言 &#x1f349;GAN 的基本原理 &#x1f348;生成器&#xff08;Generator&#xff09; &#x1f348;判别器&…

【嵌入式DIY实例-ESP8266篇】-LCD ST7735显示DS3231 RTC时间

LCD ST7735显示DS3231 RTC时间 文章目录 LCD ST7735显示DS3231 RTC时间1、硬件准备与接线2、代码实现本文将介绍如何使用 ESP8266 NodeMCU 板 (ESP-12E) 和 DS3231 RTC 模块制作一个简单的数字实时时钟,其中可以使用连接到 NodeMCU 的两个按钮设置时间和日期,并将它们打印(带…

llm学习-4(llm和langchain)

langchain说明文档&#xff1a;langchain 0.2.6 — &#x1f99c;&#x1f517; langChain 0.2.6https://api.python.langchain.com/en/latest/langchain_api_reference.html#module-langchain.chat_models 1&#xff1a;模型 &#xff08;1&#xff09;自定义模型导入&#x…

c语言回顾-内存操作函数

目录 前言 1.memcpy 函数 1.1函数介绍 1.2与strcpy的区别 1.3memcpy的模拟 2.memmove 函数 2.1函数介绍和使用 2.2函数的模拟 3.memset函数 3.1函数介绍 3.2函数的模拟 4.memcmp函数 4.1函数的使用 4.2函数的模拟 结束语 前言 在动态内存的章节中小编详细讲解了动…

7.基于SpringBoot的SSMP整合案例-表现层开发

目录 1.基于Restfu1进行表现层接口开发 1.1创建功能类 1.2基于Restful制作表现层接口 2.接收参数 2使用Apifox测试表现层接口功能 保存接口&#xff1a; 分页接口&#xff1a; 3.表现层一致性处理 3.1先创建一个工具类&#xff0c;用作后端返回格式统一类&#xff1a;…