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;  //性别 男性 ture
  int *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;  //性别 男性 ture
  int *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查看日志

学习记录,侵权联系删除。
来源:朱老师物联网大课堂

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/772225.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【免费可视化工具】助力风电行业智能化管理

在绿色能源日益成为全球共识的今天&#xff0c;风电作为清洁能源的重要组成部分&#xff0c;正以前所未有的速度发展。然而&#xff0c;随着风电场规模的扩大和数量的增加&#xff0c;如何高效、直观地管理和监控风电资源成为了一个亟待解决的问题。 而山海鲸可视化这款免费可…

汉光联创HGLM2200N黑白激光多功能一体机加粉及常见问题处理

基本参数&#xff1a; 机器型号&#xff1a;HGLM2200N 产品名称&#xff1a;A4黑白激光多功能一体机 基础功能&#xff1a;打印、扫描、复印 打印速度&#xff1a;22页/分钟 纸张输入容量&#xff1a;150-249页 单面支持纸张尺寸&#xff1a;A4、A5、A6 产品尺寸&#x…

功能详解-电商接口丨电商API

随着电商平台各类机制日益成熟&#xff0c;电商接口逐渐被大家所熟知&#xff0c;淘宝、天猫、京东、拼多多、抖店、快手、小红书这些都是主流的电商平台&#xff0c;为了提升电商管理系统的效率&#xff0c;开发者可以通过电商接口将多个电商平台的数据和功能集成。 电商接…

firewalld高级配置

一、1、关于iptables的知识 IP数据包过滤系统是一种功能强大的工具&#xff0c;可用于添加、编辑和除去规则&#xff0c;这些规则是做数据包过滤决定时&#xff0c;防火墙所遵循和组成的规则。这些规则存储在专用的数据包过滤表中&#xff0c;而这些表集成在Linux内核中。在数据…

二手物品交易小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;管理员管理&#xff0c;商品信息管理&#xff0c;论坛管理&#xff0c;收货地址管理&#xff0c;基础数据管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;商品信息&…

ESIX挂载usb移动硬盘或者优盘并拷贝原数据存储数据

1、esxi支持和不支持分区格式 ESXi 6.*系列默认不支持NTFS、exFAT等常见文件系统&#xff0c;fat32支持但没意义仅小文件可以用&#xff0c;不过可以通过一些额外步骤和第三方工具来访问NTFS格式的存储设备&#xff0c;但生产环境不推荐这样做&#xff0c;需要安装第三方包。 e…

2024 年第十四届 APMCM 亚太地区大学生数学建模竞赛B题超详细解题思路+数据预处理问题一代码分享

B题 洪水灾害的数据分析与预测 亚太中文赛事本次报名队伍约3000队&#xff0c;竞赛规模体量大致相当于2024年认证杯&#xff0c;1/3个妈杯&#xff0c;1/10个国赛。赛题难度大致相当于0.6个国赛&#xff0c;0.8个妈杯。该比例仅供大家参考。 本次竞赛赛题难度A:B:C3:1:4&…

中霖教育:税务师考试报名现有职称怎么写?

【中霖教育怎么样】】【中霖教育好吗】 报考税务师考试的考生在报名期间需要登录税务师职业资格考试网上报名系统填写报名信息。 税务师报名现有职称按照实际情况填写会计助理、会计或者会计主管&#xff0c;没有工作的考生在填写工作信息的时候填写待业即可。 在报名阶段&a…

Linux_进程池

目录 1、进程池基本逻辑 2、实现进程池框架 3、文件描述符的继承 4、分配任务给进程池 5、让进程池执行任务 6、回收子进程 7、进程池总结 结语 前言&#xff1a; 在Linux下&#xff0c;进程池表示把多个子进程用数据结构的方式进行统一管理&#xff0c;在任何时候…

MATLAB和Python发那科ABB库卡史陶比尔工业机器人模拟示教框架

&#x1f3af;要点 &#x1f3af;模拟工业机器人 | &#x1f3af;可视化机器人DH 参数&#xff0c;机器人三维视图 | &#x1f3af;绘制观察运动时关节坐标位置、速度和加速度 | &#x1f3af;绘制每个关节处的扭矩和力 | &#x1f3af;图形界面示教机器人 | &#x1f3af;工业…

通过9大步骤,帮助企业在数字化转型中搭建数据分析的报表体系!

引言&#xff1a;在数字化转型中&#xff0c;企业搭建数据分析的报表体系是一个系统性的过程&#xff0c;需要综合考虑业务需求、数据来源、技术平台等多个方面。此外从报表生命周期的角度来说&#xff0c;从产生、使用以及最后消亡退出体系&#xff0c;都需要通盘考虑&#xf…

[数据集][目标检测]轮椅检测数据集VOC+YOLO格式13826张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;13826 标注数量(xml文件个数)&#xff1a;13826 标注数量(txt文件个数)&#xff1a;13826 标…

remix测试文件测试智能合约

remix内其实也是可以通过编写测试文件来测试智能合约的&#xff0c;需要使用插件自动生成框架以及测试结果。本文介绍一个简单的HelloWorld合约来讲解 安装插件多重检测&#xff1a; &#xff08;solidity unit testing&#xff09; 编译部署HelloWorld合约 // SPDX-License-…

在线图片转文字的软件,分享3种强大的软件!

在信息爆炸的时代&#xff0c;图片作为信息的重要载体之一&#xff0c;其内容往往蕴含着巨大的价值。然而&#xff0c;面对海量的图片信息&#xff0c;如何高效、准确地将其转化为文字&#xff0c;成为了许多人的迫切需求。今天&#xff0c;就为大家盘点几款功能强大的在线图片…

Xilinx FPGA:vivado关于RAM的一些零碎的小知识

一、xilinx fpga嵌入式存储单元 RAM----随机存取存储器&#xff1a;上电工作时可以随时从任何一个指定的地址写入&#xff08;存入&#xff09;或读出&#xff08;取出&#xff09;信息。缺点是一旦断电所存储的数据将随之丢失。RAM在计算机和数字系统中用来暂时性存储程序、数…

腾讯云COS分布式对象存储

腾讯云COS分布式对象存储 腾讯云对象存储&#xff08;Cloud Object Storage&#xff0c;COS&#xff09;是腾讯云提供的一种用于存储海量文件的分布式存储服务。 腾讯云 COS 适用于多种场景&#xff0c;如静态网站托管、大规模数据备份和归档、多媒体存储和处理、移动应用数据存…

【test】小爱同学通过esp32控制电脑开关

文章目录 一、环境准备二、开关机原理数据传输框架 三、环境搭建1.巴法云平台设置2.米家设置3.windows网络唤醒设置4.搭建esp32开发环境并部署&#xff08;1&#xff09;新建项目&#xff08;2&#xff09;导入esp32库&#xff08;3&#xff09; 添加库&#xff08;4&#xff0…

YOLOv8入门 | 重要性能衡量指标、训练结果评价及分析及影响mAP的因素【发论文关注的指标】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录 &#xff1a;《YOLOv8改进有效…

从CVPR 2024看 NeRF 最新改进&应用

三维重建领域必不可少的NeRF技术最近又有新突破了&#xff01; 首先是SAX-NeRF框架&#xff0c;专为稀疏视角下X光三维重建设计&#xff0c;无需CT数据进行训练&#xff0c;只使用 X 光片即可&#xff0c;等于给NeRF开透视眼&#xff01; 还有清华提出的GenN2N&#xff0c;一…

Canvas合集更更更之实现由画布中心向外随机不断发散的粒子效果

实现效果 1.支持颜色设置 2.支持粒子数量设置 3.支持粒子大小设置 写在最后&#x1f352; 源码&#xff0c;关注&#x1f365;苏苏的bug&#xff0c;&#x1f361;苏苏的github&#xff0c;&#x1f36a;苏苏的码云