内存泄露,C++
内存泄露,C++通常是指new出来的内存没有delete掉。在你的代码里边,new了一块内存,然后马上就delete,自然就没有内存泄露了(呃……其实我也不确定啦,因为你用的是delete,而不是delete[])。
而@Miao在评论里面说的,把x换成指针,在构造函数里new一块内存给它,10秒钟内系统就要卡死。如果没有在析构函数里面delete,自然,就会发生上一段所说的,new出来的内存没有delete掉,内存泄露啰!系统也就由此卡死。
那么x换成指针类型后,析构函数里面也用了delete,是不是就不会发生内存泄露呢?不是的。因为“new MyClass[10]”的时候,MyClass的构造函数调用了10次,而“delete a”的时候,MyClass的析构函数只被调用了1次!因为使用delete,就是告诉编译器,a所指的地方,只有一个MyClass对象!
那有什么办法告诉编译器,a所指是一个MyClass数组,而不是单个对象呢?使用 delete[]。那样,编译器就会知道,a所指的地方,有10个MyClass对象(至于怎么知道的,不在这里讨论),于是针对每个对象调用一次析构函数。也就不会有内存泄露了。
记得用delete配对new,用delete[]配对new[]。事实上,代码里边用delete来配对new[],行为未定义,嗯,是C++标准里面没有定义。也许是因为你比较幸运,程序没有表现出问题~~
补充回答一下楼主的疑问:为什么“使用delete删除基础数据类型的数组也是不会发生泄漏的”?
看下面的代码:
- char*c =newchar[10];
- delete c;
在“delete c;”时,我们可以认为程序执行了以下两个动作:
1. 针对被delete对象的类型,调用相应的析构函数。因为这里是基础数据类型char,所以没有任何实质性动作。
2. 回收指针c所指的内存块。这里,c的类型没有起作用。就是说,系统并不会因为c的类型是char而只回收一个字节。系统所做的是,根据c的值,找到对应的内存块的大小,以及其他相关信息,然后回收。这些信息哪里来?调用new、new[]的时候记录下来的。记录在什么地方?这是new、new[]的实现者,或者更底层程序的实现者所要关心的......
需要再次强调的是,楼主没有看到内存泄露的现象,并不表示“使用delete删除基础数据类型的数组”是安全的!
内存泄露,C++的更多相关文章
- java: web应用中不经意的内存泄露
前面有一篇讲解如何在spring mvc web应用中一启动就执行某些逻辑,今天无意发现如果使用不当,很容易引起内存泄露,测试代码如下: 1.定义一个类App package com.cnblogs. ...
- 查看w3wp进程占用的内存及.NET内存泄露,死锁分析
一 基础知识 在分析之前,先上一张图: 从上面可以看到,这个w3wp进程占用了376M内存,启动了54个线程. 在使用windbg查看之前,看到的进程含有 *32 字样,意思是在64位机器上已32位方 ...
- C++11 shared_ptr 智能指针 的使用,避免内存泄露
多线程程序经常会遇到在某个线程A创建了一个对象,这个对象需要在线程B使用, 在没有shared_ptr时,因为线程A,B结束时间不确定,即在A或B线程先释放这个对象都有可能造成另一个线程崩溃, 所以为 ...
- 基于HTML5的WebGL应用内存泄露分析
上篇(http://www.hightopo.com/blog/194.html)我们通过定制了CPU和内存展示界面,体验了HT for Web通过定义矢量实现图形绘制与业务数据的代码解耦及绑定联动, ...
- android:布局、绘制、内存泄露、响应速度、listview和bitmap、线程优化以及一些优化的建议!
1.布局优化 首先删除布局中无用的控件和层级,其次有选择地使用性能较低的viewgroup,比如布局中既可以使用RelativeLayout和LinearLayout,那我们就采用LinearLayo ...
- js内存泄露的几种情况详细探讨
内存泄露是指一块被分配的内存既不能使用,又不能回收,直到浏览器进程结束.在C++中,因为是手动管理内存,内存泄露是经常出现的事情.而现在流行的C#和Java等语言采用了自动垃圾回收方法管理内存,正常使 ...
- 使用Xcode7的Instruments检测解决iOS内存泄露
文/笨笨的糯糯(简书作者)原文链接:http://www.jianshu.com/p/0837331875f0著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 作为一名iOS开发攻城狮, ...
- 使用Visual Leak Detector for Visual C++ 捕捉内存泄露
什么是内存泄漏? 内存泄漏(memory leak),指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况.内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段 ...
- java内存溢出和内存泄露
虽然jvm可以通过GC自动回收无用的内存,但是代码不好的话仍然存在内存溢出的风险. 最近在网上搜集了一些资料,现整理如下: —————————————————————————————————————— ...
- java内存泄露
上一篇提到的是java垃圾回收,今天谈谈java的内存泄露. 首先谈下java的内存管理机制: 在Java程序中,我们通常使用new为对象分配内存,而这些内存空间都在堆(Heap)上. public ...
随机推荐
- JavaScript-Tool:jquery.md5.js
ylbtech-JavaScript-Tool:jquery.md5.js 1.返回顶部 1. 引入js后 使用方法:document.write($.md5('1234')); 加密结果:81dc9 ...
- vue-router 安装
如果在一个模块化工程中使用它,需要通过Vue.use() 明确的安装路由功能,如果使用全局的script标签,则不需要手动安装. Vue Router是Vue.js官方的路由管理器.它和Vue.js的 ...
- 使用libvirt技术监控虚拟机资源利用情况
使用libvirt技术监控虚拟机资源利用情况 (一)计算资源与内存资源的监控 libvirt中提供virDomainGetInfo方法可以将一个domain的计算资源和内存资源的使用情况封装在一个结构 ...
- stdout引发的curl 302跳转 crash
重现步骤: 0.开发环境:Windows 7 SP1 64bit, VS2008 SP1 1.进程中修改了stdout这个句柄的值:调用了prinft和cout都会修改stdout,TRACE不会修改 ...
- mysql 自动备份命令
--1.全备 --single-transaction:基于此选项能实现热备InnoDB表 --databases要备份的表名mysqldump -u root -p --single-transa ...
- java多线程知识点收集-总
1.线程与进程的关系 进程(Process):当一个程序进入内存开始运行时,就产生一个进程.进程是一个独立单元,它的资源由系统分配和调度. 线程(Thread):线程是进程的执行单元,线程在进程中是独 ...
- 洛谷 - P1338 - 末日的传说 - 打表
https://www.luogu.org/problemnew/show/P1338 先打表看了一下规律,居然看出来n的位置是阶梯往前的.而每个阶梯的头头,必有后半段降序. 再仔细看一下居然每次交换 ...
- spring基于注解的IOC
曾经的XML配置: <bean id="accountService" class="com.itheima.service.impl.AccountService ...
- 51nod 1011 【完全背包】
完全背包的变形: 这些数字可以取多次,dp[i]代表前 i 物品组成N时的方案数. #include<iostream> #include<cstring> #include& ...
- [3dmax教程] 人物+骨骼+蒙皮+动画教程
人物+骨骼+蒙皮+动画完整教程选准备好一个人,做人的方法我在这里就不做了,大家可以学都用poser来做一个. 在大腿里建立4根骨骼! 在前视图中移动如图所示位置! 做一段简单的骨骼向前伸的动画,做4 ...