析构函数的注意问题以及用new开出来的空间用free释放会怎样

2023-11-19

大学学了越来越多的算法技术,但却不能忽略本源,编程语言是一切的基础,回过头来看依旧存在许多知识漏洞。返濮方能归真!!

前几天翻看别人的面经,发现了一个很有意思的问题,用new开出来的空间用free释放会怎样,借此机会,复习一下析构函数,并写了一个测试案例,来深度分析。

#include <iostream>
#include <string.h>
//#include <bits/stdc++.h> //c++万能头
using namespace std;

class test
{
private:
public:
    int num;
    char* str1;
    char* str2;
    test();
    ~test();
};

test::test()
{
    cout << "construct" << endl;
    num = 10;
    str1 =(char*)malloc(5);
    strcpy(str1, "abcd");
    str2=new char[5];
    strcpy(str2, "abcd");

}

test::~test()
{
    cout << "destroy" << endl;
    //free(str1);
    //delete []str2;
}


int main()
{
    test* a = new test();
    test* b = new test();
    cout << a->str2 << endl;
    cout << b->str2 << endl;
    cout << a->num << endl;
    cout << b->num << endl;
    delete a;
    delete b;
    cout << a->str2 << endl;
    cout << b->str2 << endl;
    cout << a->num << endl;
    cout << b->num << endl;
}

运行结果如下

可以发现两个对象在走完析构后,在栈区的变量num是完成了释放,而由我们自己开在堆区的字符串指针变量却没有释放,因此如果类中有自己动态开的空间,系统不会帮你释放,一定要在析构函数中自己释放。这样可以避免内存泄漏。

1、成员变量如果是指针。那么程序需要分配的内存是存储指针占用的内存(32位程序是4个字节)和指针指向的内存。其中指针占用的内存是有编译器管理的,而指针指向的内存是你自己管理的。也就是,这个指针占用的内存(4个字节)就会自动在析构函数里自动释放。但是指针指向的部分内存默认析构函数是不会帮你释放的,因为编译器也不知道你这个指针指向的是不是你自己分配的内存,也不知道你将来还会不会用这段内存。
2、当程序/进程执行完,程序占用的所有内存都会被操作系统释放。即使没有显示的delete

接下来对析构函数进行修改,将对象b改由用free释放。

#include <iostream>
#include <string.h>
//#include <bits/stdc++.h> //c++万能头
using namespace std;

class test
{
private:
public:
    int num;
    char* str1;
    test();
    ~test();
};

test::test()
{
    cout << "construct" << endl;
    num = 10;
    str1 =(char*)malloc(5);
    strcpy(str1, "abcd");

}

test::~test()
{
    cout << "destroy" << endl;
    free(str1);
    //delete[]str2;
}


int main()
{
    test* a = new test();
    test* b = new test();
    cout << a->str1 << endl;
    cout << b->str1 << endl;
    cout << a->num << endl;
    cout << b->num << endl;
    delete a;
    free(b);
    cout << a->str1 << endl;
    cout << b->str1 << endl;
    cout << a->num << endl;
    cout << b->num << endl;
    //system("cls");
    return 0;
}

运行结果

 可以看到对象b没有调用析构函数,num和字符串指针都没有被释放,也许有些编译器比较智能,能检查出问题,自动释放,有些情况,编译器不会报错,一些在栈区的变量例如num也许会被释放

但你动态开的绝不可能,因为根本没走析构函数。

一句话总结free去释放new开出来的对象不会走析构函数,对象里有些动态开的空间释放不了就会导致内存泄漏。

相反我们可以大胆的推测如果用malloc给对象开空间,再用delete释放,是不会走构造函数的,所有对象绝对不能用malloc开空间。

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

析构函数的注意问题以及用new开出来的空间用free释放会怎样 的相关文章

  • 切换图片框可见性 C#

    为什么图片框控件的可见性属性在这里不起作用 我最初将它们设置为 false 以便在屏幕加载时它们不可见 但后来我想切换这个 我已完成以下操作 但似乎不起作用 这是一个 Windows 窗体应用程序 private void Action w
  • 如何将pdf页面设置设置为打印属性对话框?

    大家好 我想知道如何设置 pdf 页面设置到打印属性对话框 例如 如果我的 PDF 页面设置为横向 则布局会自动显示横向而不是纵向 如果我的 PDF 页面设置为纵向 则布局会自动显示纵向 我在这个主题上做了很多研发 但没有找到任何满意的链接
  • 在运行时设置 DataGridView 上的 DataFormatString?

    是否可以在运行时设置 ASP NET DataGridView 中的列或单元格的 DataFormatString 属性 这应该有效 BoundField priceField grid Columns 0 as BoundField pr
  • 如何使用汇编获取BIOS时间?

    我正在从头开始实现一个小型操作系统 用于教育目的 现在 我想使用汇编来获取 BIOS 时间 我对此进行了很多搜索 但找不到任何代码示例来执行此操作 如果有人可以提供任何参考或代码示例或与此相关的任何内容 我将非常感激 See 时钟中断 1a
  • 如何将字节块读入结构体

    我有一个需要处理的资源文件 它包含一组文件 首先 资源文件列出了其中包含的所有文件 以及一些其他数据 例如在此结构中 struct FileEntry byte Value1 char Filename 12 byte Value2 byt
  • rand() 播种与 time() 问题

    我很难弄清楚如何使用 rand 并使用 Xcode 用 time 为其播种 我想生成 0 到 1 之间的随机十进制数 该代码为我提供了元素 1 和 2 看似随机的数字 但元素 0 始终在 0 077 左右 有什么想法吗 我的代码是 incl
  • 将成员函数作为参数传递/c++

    我想用 C 实现一个类b可以通过封装该迭代器类型的成员集进行某种迭代 喜欢 b object for each x do function f so 函数 f会得到每个人的x成员并做任何事情 比方说 void function f x me
  • 抽象类或接口。哪种方式是正确的?

    有两种方法可以选择抽象类或接口 微软解决方案和Oracle解决方案 微软 设计指南 请使用抽象 在 Visual Basic 中为 MustInherit 类而不是接口来将协定与实现分离 http msdn microsoft com en
  • QThread - 使用槽 quit() 退出线程

    我想在线程完成运行时通知对象 但是 我无法让线程正确退出 我有以下代码 处理器 cpp thread new QThread tw new ThreadWorker connect tw SIGNAL updateStatus QStrin
  • 如何在 VS Code 中为 CMake 项目设置 C/C++ IntelliSense?

    我正在尝试使用 libTooling 编写一个工具 我对其进行了设置 以便它可以使用 LLVM 文档中的示例进行编译 然而 C C IntelliSense 似乎不适用于 CMake 项目 我的工具位于
  • 无法通过 LINQ to Entities 使用某些功能?

    我正在尝试使用 LINQ 查询在项目上实现搜索功能 由于数据有时包含带有重音符号和其他符号的字符 因此我创建了一种方法来删除这些字符以进行搜索 这是我的代码 var addresses from a in db Addresses join
  • 在 .NET 中记录 StackOverflowException

    最近 我的 NET 应用程序 asp net 网站 中出现了堆栈溢出异常 我之所以知道该异常是因为它出现在我的 EventLog 中 我知道 StackOverflow 异常无法被捕获或处理 但是有没有办法在它杀死您的应用程序之前记录它 我
  • 理解 C++11 中的 std::atomic::compare_exchange_weak()

    bool compare exchange weak T expected T val compare exchange weak 是 C 11 中提供的比较交换原语之一 它是weak即使对象的值等于 它也会返回 falseexpected
  • 展开路径中具有环境变量的文件名

    最好的扩张方式是什么 MyPath filename txt to home user filename txt or MyPath filename txt to c Documents and settings user filenam
  • 为什么C语言中可以使用多个分号?

    在 C 中我可以执行以下操作 int main printf HELLO WORLD 它有效 这是为什么 我个人的想法 分号是一个 NO OPERATION 来自维基百科 指示符 拥有一大串分号与拥有一个分号并告诉 C 语句已结束具有相同的
  • 正在获取“未终止 [] 设置”。 C# 中的错误

    我正在 C 中使用以下正则表达式 Regex find new Regex url
  • 如何使用 ASP.NET Web 表单从代码隐藏中访问更新面板内的文本框、标签

    我在更新面板中定义了一些控件 它们绑定到中继器控件 我需要根据匿名字段隐藏和显示用户名和国家 地区 但问题是我无法以编程方式访问更新面板中定义的控件 我如何访问这些控件 我也在网上查找但找不到很多参考资料 下面是来自aspx页面和 cs页面
  • 在何处将 CFLAG(例如 -std=gnu99)添加到 (Eclipse CDT) 自动工具项目中

    我有一个简单的 Autotools C 项目 不是 C 其框架是由 Eclipse CDT Juno 为我创建的 CFLAG 通过检查 似乎是 g O2 我希望所有生成的 make 文件也具有 std gnu99附加到 CFLAG 因为我使
  • 通过 cmake 链接作为外部项目包含的 opencv 库[重复]

    这个问题在这里已经有答案了 我对 cmake 比较陌生 经过几天的努力无法弄清楚以下事情 我有一个依赖于 opencv 的项目 它本身就是一个 cmake 项目 我想静态链接 opencv 库 我正在做的是我的项目中有一份 opencv 源
  • 使用剪贴板 SetText 换行

    如何使用 SetText 方法添加换行符 I tried Clipboard SetText eee n xxxx 但当我将剪贴板数据粘贴到记事本中时 它没有给我预期的结果 预期结果 eee xxxx 我怎样才能做到这一点 Windows

随机推荐

  • Sublime Text配置anaconda环境

    Ref https blog csdn net pptde article details 110791950 spm 1001 2101 3001 6661 1 utm medium distribute pc relevant t0 n
  • docker创建CentOS云主机(docker实践)

    基于Ubuntu操作系统 从零开始构建一套docker虚拟化平台 docker的产物为 容器 docker构建容器 Nginx WEB docker启动虚拟机 创建CentOS云主机 同样是容器 对之前内容的总结熟悉 要求 CentOS 7
  • Android实现裁剪

    Android自定义View实现图片缩放旋转移动裁剪 灰信网 软件开发博客聚合 freesion com SuppressLint AppCompatCustomView public class CorpToView extends Im
  • java前后端传递日期类型不一致的转换问题

    今天在做学生信息的展示时发现展示的日期和数据库中日期不同 本来最开始是用SimpleDateFormat进行转换的 但是转换之后的是字符串类型的 与date类型对不上 所以就上网查了一下 发现可以用 DateTimeFormat和 Json
  • 牛顿法

    牛顿法被称为牛顿 拉夫逊 Newton Raphson 方法 牛顿在17世纪提出用来求解方程的根 假设点x 位函数f x 的根 则f x 0 将函数f x 在点处进行一阶泰勒展开有 假设点为函数f x 的根 则有 那么可以得到 牛顿法通过迭
  • STM8的ADC的五种工作模式

    STM8的ADC的五种工作模式 STM8的ADC是10位的逐次比较型模拟数字转换器 多达16个多功能的输入通道 拥有5种转换模式 转换结束可产生中断 STM8 ADC的初始化顺序如下 1 AD输入通道对应的IO设置为上拉输入 2 配置AD参
  • JVM学习笔记(二)------Java代码编译和执行的整个过程

    http blog csdn net cutesource article details 5904542 Java代码编译是由Java源码编译器来完成 流程图如下所示 Java字节码的执行是由JVM执行引擎来完成 流程图如下所示 Java
  • JAVA实现二叉树的前、中、后序遍历(递归与非递归)

    最近在面试中遇到过问到二叉树后序遍历非递归实现的方法 之前以为会递归的解决就OK 看来还是太心存侥幸 在下一次面试之前 特地整理一下这个问题 首先二叉树的结构定义 java代码如下 public class Node private int
  • 花式获取ssl证书有效期

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pem是什么 二 读取pem证书有效期 1 命令读取 2 C C 读取 3 具体分析 总结 前言 在网络通信过程中 为了数据在传输过程中保持私密 就要用到
  • 数据结构与算法学习指南,可能是最适合新手的了!

    文章目录 先来聊聊学习数据结构与算法 数据结构与算法 听起来就难得不要不要的 数据结构与算法 到底该怎么学 通用性建议 如何学习编程知识 1 你需要的不是一个参考 2 不要钻牛角尖 3 一定要多交流 4 你得多动手 不是让你找人打架 那么针
  • 【java poi】向已存在的excel中追加数据

    1 Maven依赖
  • Mkdocs 存在任意文件读取漏洞

    文章目录 Mkdocs 存在任意文件读取漏洞 1 Mkdocs简介 2 漏洞描述 3 影响版本 4 fofa 查询语句 5 漏洞复现 6 POC EXP 7 整改意见 8 往期回顾 Mkdocs 存在任意文件读取漏洞 1 Mkdocs简介
  • java面向对象程序设计第三版耿祥义pdf_java基础知识干货——封装

    很多java初学者 在学到Java面向对象方面的知识点的时候 会觉得这块的知识点真的蛮绕的 一个知识点一个知识点的往外冒 对于初学者来说区分构造器和方法就花费了一整天的时间 现在小编带大家重新过一遍知识点 先背下来一个理念 面向对象程序设计
  • String格式问题:将String格式请求方法时,String格式突然转化为对象的问题

    String格式问题 将String格式请求方法时 String格式突然转化为对象的问题 如上图所示 在使用队列调用方法时传递的参数为 xxxxxx 但是在方法中接收到的参数为 id msg xxxxxx name java lang St
  • 【投资界学堂】创业者如何远程管理异地团队

    转自 http pe pedaily cn 201106 20110627214254 all shtml p1 摘要投资界6月27日消息 美国商业网站Under30CEO近日刊载文章 如何成功的远程管理团队 文章选摘了青年创业理事会提供的
  • MQTT通信在JS中的实现

    MQTT协议 Message Queuing Telemetry Transport 消息队列遥测传输是由 IBM 发布的一种基于发布 订阅范式的 轻量级 消息协议 工作于TCP IP协议族之上 它是一种低开销 低带宽占用的即时通讯协议 可
  • 系统架构设计说明书

    目录 修订历史 文档审批信息 1 简介 1 1 目的 1 2 面向读者 1 3 文档组织 1 4 设计限定 1 5 术语说明 1 6 参考文献 2 项目建设目标和预期成果 2 1 建设目标 2 2 主要预期成果 3 系统非功能需求分析 3
  • 网络安全人才缺口超百万,如今的就业情况怎样?

    2022年9月7日 国家网络安全宣传周准时开始 本次网络安全宣传周和以前一样 主要目的都是为了普及网络安全知识 提高网络安全的防护技能 提升对电信网络诈骗的防范意识 在今年的主题论坛上 工信部发布并解读了 2022年网络安全产业人才发展报告
  • 【Vue】笔记四:浅析Vue三种开发模式:MVC、MVP、MVVM

    首先明确一点 开发模式 设计模式 开发模式 一个开发项目的方式或标准 RMVC 比较常见的三种开发模式 MVC MVP MVVM 1 MVC 个人感觉重点在View MVC全名是Model View Controller 是模型 model
  • 析构函数的注意问题以及用new开出来的空间用free释放会怎样

    大学学了越来越多的算法技术 但却不能忽略本源 编程语言是一切的基础 回过头来看依旧存在许多知识漏洞 返濮方能归真 前几天翻看别人的面经 发现了一个很有意思的问题 用new开出来的空间用free释放会怎样 借此机会 复习一下析构函数 并写了一