c++之A a和A *a=new A()

2023-10-31

      new是在堆上分配内存,它需要用delete释放,否则会造成内存泄漏。

      A a 在程序执行完毕后,会自动释放内存。

      int main(){

      A a;//定义了一个对象

      A *p=new A(); //在堆上定义了一个对象,它的指针保存在p里;堆上定义的对象没有名字,必须用指针保存。

      return 0;

      }// a 到这里的时候,它占用的内存会被释放,而p,除非调用 delete p,否则内存永远不会被回收,指针p丢弃后,

      // 那块内存没被释放,无法被再次使用,造成内存浪费

动态分配内存new 关键字

       1 动态分配内存,将从堆中分配内存。局部变量一般存储在堆栈中。

       2 使用new将从空闲存储区中为对象分配内存,并返回一个指向该对象的指针即该对象的地址。new运算符的特点:

          用new运算符分配的对象没有名字,对该对象的操作都要通过指针间接的完成。

       3 动态创建数组:int *p=new int[11];

       4 耗尽内存:如果程序用完了所有可用的内存,new表达式就有可能失败。如果new表达式无法获得需要的内存空间。系统将会抛出名为bad_alloc 异常。

       5 悬垂指针:执行delete p 后只是把p指向的内容销毁了,并没有删除指针p本身,还可以将p重新指向到另一块新的内存块,因此p还指向原来他指向的对象的地址,然而p所指向的内容给销毁释放掉了,因此p不再有效而变得没有意义。

       6 常见错误:如果对某个指针动态分配了内存,又把另一个变量的地址付给了这个指针,这时这个指针就指向了一个静态地址,而不是原来的动态的地址。这时候用delete删掉这个指针的时候就会报错,因为delete不能删除静态指针。

#include <iostream>
using namespace std;
class hyong {
public:
	int a, b, c;
	hyong() {
		a = b = c = 0;
	}
	hyong(int i) {
		a = b = c = i;
	}
	~hyong() {
		cout << "xigou" << "/n";
	}
};
int main() {
	hyong *p = new hyong;
	hyong *p1 = new hyong();
	cout << p->a << p1->a <<endl; //输出两个0,都调用默认构造函数初始化指针。
	int *p2 = new int;
	int *p3 = new int();
	int *p4 = new int(1); //new分配内存的初始化方式。
	//对于类置类型来说p2没有被初始化得到的是一个随机值, p3被初始化为0
	//,p4被初始化为1。
	cout<<*p2<<endl<<*p3<<endl<<*p4<<endl;  //输出一个随机值,一个0,一个1
	int i = 10;
	delete p4;
	cout << *p4 << endl; //p4现在是悬垂指针,delete只是释放掉了指针p4所指向地址的内容,
	//但指针p4仍然指向原来的地址, 但没有内容,指针p4仍然可以再指向其他地址。
	p4 = &i;
	cout << *p4 << endl; //可以对悬垂指针p4重新赋地址。
	const int *p5 = new int;
	const int *p6 = new int(4);
	cout << *p5 << *p6 << endl; //输出一个随机值和4,const常量必须在声明时初始化。
	int *p7 = new int[2];
	p7[0] = 5;
	p7[1] = 6;
	cout << p7[0] << p7[1] <<endl; //定义动态数组
	//const int *p8=new int[2];  //错误,因为动态数组不能在声明时初始化,而const又必须要求在声明时初始化,发生冲突,出错。
	delete p1;
	delete p;
	//delete p,p1;   //注意,如果使用该语句将则只调用一次析构函数。
	delete p2, p3, p4, p5, p6;
	delete[] p7;
	//int *p8=new int(9); int a=8;  p8=&a; delete p8;  //错误,现在的指针p8重新指向了一个静态的地址,
	//用delete删掉一个静态地址将发生错误
}




本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++之A a和A *a=new A() 的相关文章

随机推荐

  • 1 .SQL——DataGrip 中的DML三种添加数据方法

    insert into student xingx xi id name age grade xb woketime value 1 aa 10 99 男 2023 12 1 给指定字段添加数据 insert into student xi
  • 谷粒商城笔记+踩坑汇总篇

    导航 黑马Java笔记 踩坑汇总 JavaSE JavaWeb SSM SpringBoot 瑞吉外卖 SpringCloud 黑马旅游 谷粒商城 学成在线 设计模式 牛客面试题 目录 一 摘要 二 微服务架构图 三 文章汇总 一 摘要 部
  • 【待解决】报错:gpt模型训练的时候,有报错的torch.distributed.elastic.multiprocessing.errors.ChildFailedError:

    pytorch多GPU并行的问题 torch distributed elastic multiprocessing errors c CSDN博客
  • Goby漏洞更新

    Goby预置了最具攻击效果的漏洞引擎 覆盖Weblogic Tomcat等最严重漏洞 每天从互联网 如CVE 会产生大量的漏洞信息 我们筛选了会被用于真实攻击的漏洞进行每日更新 Goby也提供了可以自定义的漏洞检查框架 发动了互联网的大量安
  • QTreeView使用整理

    在Qt开发过程中 树控件QTreeView使用的非常频繁 各种批量展示和编辑信息的地方 都用得上该控件 在使用QTreeView过程中 用到各种常规 不常规的功能 并进行过各种改造 这里将这些知识和技巧作一个总结 一 Model View框
  • C++实现基于mfc的仓库管理系统(可连MySQL数据库)

    概述 本系统是一个基于mfc实现的可以连接数据库的仓库管理系统 其余管理系统也可根据此系统进行参考与修改进行实现 主要功能 本超市仓库管理系统 通过对数据库的查询 能够实现系统登录以及对商品与用户信息的增删改查操作 支持多用户多身份登录 其
  • 大学《数据库系统》课程设计报告

    二话不说 先怼源码 gitHub源码地址 题 目 教学管理系统 专 业 计算机科学与技术 作 者 马志成 完成时间 2019年1月3日 一 实验目的 数据库系统课程设计是为了配合数据库原理及应用开发而设置的 是计算机科学与技术 网络工程 信
  • Contest2574 - 高级语言程序实践--第6次作业--计信A2107-2113

    写在前面 乍一看挺难 仔细想想也就纸老虎罢了 不写题解 自己想吧 目录 问题 A 字符串去重排序 问题 B 两数之和 问题 C 完美立方数 问题 D 分解质因数 问题 E 子列表最大长度 问题 F 列表的合并与排序 问题 G 个人数据脱敏
  • 别再问我们用什么画图的了!问就是excalidraw

    每次发 https github com tal tech go zero 相关文章时 都会有读者问我们用什么画图的 这图什么工具画的呀 好看 这个手绘风格真好看 用啥工具画的呀 可不可以介绍下这个画图的工具 诸如此类的问题 所以我决定写篇
  • MYSQL 删除空记录 NULL

    数据库小问题 今天在处理数据库中的数据的时候 遇到空记录的问题 在百度上搜索之后 给出的答案有这样几种 1 Delete from student where name null 2 Delete from student where na
  • 不只是噪声,更是数学美 ---浅谈Perlin Noise

    首先说明为什么这篇博客叫这个题目 我刚刚开始学习Perlin Noise是从知乎上的一篇文章入门的 作者的题目是不只是噪声 我觉得很有韵味 就借鉴过来 这是链接 https zhuanlan zhihu com p 22337544 一 背
  • navicat与mysql

    MySQL数据库用于存放数据 客户端navicat是为了方便操作数据库而设计的一种图形化软件 转自知乎如何安装MySQL数据库和navicat客户端 知乎 1 数据库如何安装 MySQL Begin Your Download 官网安装 安
  • MySQL基本知识

    什么是事务 事务是一个独立的工作单元 里面的操作要不全部成功 要不全部失败 事务有什么特性 原子性 操作要不全部成功 要不全部失败 隔离性 多个并发事务之间相互隔离 互不干扰 或者说一个事务的操作对于另外一个事务是不可见的 持久性 事务一旦
  • 密集预测/Dense Prediction

    Pixelwise dense prediction is the task of predicting a label for each pixel in the image 来自于卷积神经网络在图像语义分割 semantic image
  • haproxy应用

    不用手动编译安装 haproxy 1 7 3 tar gz yum install y rpm build rpmbuild help rpmbuild tb haproxy 1 7 3 tar gz cd root rpmbuild RP
  • NLP专栏|图解 BERT 预训练模型!

    关注后 星标 Datawhale 每日干货 每月组队学习 不错过 Datawhale干货 作者 张贤 哈尔滨工程大学 Datawhale原创作者 本文约7000字 NLP专栏文章 建议收藏阅读 审稿人 Jepson Datawhale成员
  • linux内核模块编程(二)----timer定时器

    先给自己打个广告 本人的微信公众号正式上线了 搜索 张笑生的地盘 主要关注嵌入式软件开发 足球等等 希望大家多多关注 有问题可以直接留言给我 一定尽心尽力回答大家的问题 一 why 一般地 在我们嵌入式软件开发中 使用定时器的目的是为了实现
  • C#中实现FIR带通滤波

    最近有一个需求 在C 中实现FIR滤波 网上查了些资料感觉FIR滤波使用的还算比较多 相关的原理也比较简单 参考下面在Python环境中实现FIR的博客 在C 的环境中实现了一遍 https blog csdn net moge19 art
  • LeetCode 44 二叉搜索树的最近公共祖先

    题目 给定一个二叉搜索树 找到该树中两个指定节点的最近公共祖先 百度百科中最近公共祖先的定义为 对于有根树 T 的两个结点 p q 最近公共祖先表示为一个结点 x 满足 x 是 p q 的祖先且 x 的深度尽可能大 一个节点也可以是它自己的
  • c++之A a和A *a=new A()

    new是在堆上分配内存 它需要用delete释放 否则会造成内存泄漏 A a 在程序执行完毕后 会自动释放内存 int main A a 定义了一个对象 A p new A 在堆上定义了一个对象 它的指针保存在p里 堆上定义的对象没有名字