内存泄露,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删除基础数据类型的数组也是不会发生泄漏的”?
看下面的代码:

  1. char*c =newchar[10];
  2. delete c;
 

在“delete c;”时,我们可以认为程序执行了以下两个动作:
1. 针对被delete对象的类型,调用相应的析构函数。因为这里是基础数据类型char,所以没有任何实质性动作。
2. 回收指针c所指的内存块。这里,c的类型没有起作用。就是说,系统并不会因为c的类型是char而只回收一个字节。系统所做的是,根据c的值,找到对应的内存块的大小,以及其他相关信息,然后回收。这些信息哪里来?调用new、new[]的时候记录下来的。记录在什么地方?这是new、new[]的实现者,或者更底层程序的实现者所要关心的......

需要再次强调的是,楼主没有看到内存泄露的现象,并不表示“使用delete删除基础数据类型的数组”是安全的!

内存泄露,C++的更多相关文章

  1. java: web应用中不经意的内存泄露

    前面有一篇讲解如何在spring mvc web应用中一启动就执行某些逻辑,今天无意发现如果使用不当,很容易引起内存泄露,测试代码如下: 1.定义一个类App package com.cnblogs. ...

  2. 查看w3wp进程占用的内存及.NET内存泄露,死锁分析

    一 基础知识 在分析之前,先上一张图: 从上面可以看到,这个w3wp进程占用了376M内存,启动了54个线程. 在使用windbg查看之前,看到的进程含有 *32 字样,意思是在64位机器上已32位方 ...

  3. C++11 shared_ptr 智能指针 的使用,避免内存泄露

    多线程程序经常会遇到在某个线程A创建了一个对象,这个对象需要在线程B使用, 在没有shared_ptr时,因为线程A,B结束时间不确定,即在A或B线程先释放这个对象都有可能造成另一个线程崩溃, 所以为 ...

  4. 基于HTML5的WebGL应用内存泄露分析

    上篇(http://www.hightopo.com/blog/194.html)我们通过定制了CPU和内存展示界面,体验了HT for Web通过定义矢量实现图形绘制与业务数据的代码解耦及绑定联动, ...

  5. android:布局、绘制、内存泄露、响应速度、listview和bitmap、线程优化以及一些优化的建议!

    1.布局优化 首先删除布局中无用的控件和层级,其次有选择地使用性能较低的viewgroup,比如布局中既可以使用RelativeLayout和LinearLayout,那我们就采用LinearLayo ...

  6. js内存泄露的几种情况详细探讨

    内存泄露是指一块被分配的内存既不能使用,又不能回收,直到浏览器进程结束.在C++中,因为是手动管理内存,内存泄露是经常出现的事情.而现在流行的C#和Java等语言采用了自动垃圾回收方法管理内存,正常使 ...

  7. 使用Xcode7的Instruments检测解决iOS内存泄露

    文/笨笨的糯糯(简书作者)原文链接:http://www.jianshu.com/p/0837331875f0著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 作为一名iOS开发攻城狮, ...

  8. 使用Visual Leak Detector for Visual C++ 捕捉内存泄露

    什么是内存泄漏? 内存泄漏(memory leak),指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况.内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段 ...

  9. java内存溢出和内存泄露

    虽然jvm可以通过GC自动回收无用的内存,但是代码不好的话仍然存在内存溢出的风险. 最近在网上搜集了一些资料,现整理如下: —————————————————————————————————————— ...

  10. java内存泄露

    上一篇提到的是java垃圾回收,今天谈谈java的内存泄露. 首先谈下java的内存管理机制: 在Java程序中,我们通常使用new为对象分配内存,而这些内存空间都在堆(Heap)上. public ...

随机推荐

  1. js中this 的四种用法

    this 在函数执行时,this 总是指向调用该函数的对象.要判断 this 的指向,其实就是判断 this 所在的函数属于谁. 在<javaScript语言精粹>这本书中,把 this  ...

  2. MongoDB 复制集节点增加移除及节点属性配置

    复制集(replica Set)或者副本集是MongoDB的核心高可用特性之一,它基于主节点的oplog日志持续传送到辅助节点,并重放得以实现主从节点一致.再结合心跳机制,当感知到主节点不可访问或宕机 ...

  3. kitti数据集标定文件解析

    1.kitti数据采集平台 KITTI数据集的数据采集平台装配有2个灰度摄像机,2个彩色摄像机,一个Velodyne64线3D激光雷达,4个光学镜头,以及1个GPS导航系统.图示为传感器的配置平面图, ...

  4. socket服务器并发处理

    我们知道,服务器通常是要同时服务多个客户端的,如果我们运行上一篇实现的server和client之后,再开一个终端运行client试试,新的client就不能能得到服务了.因为服务器之支持一个连接. ...

  5. Win7点击文件夹右键可打开cmd控制台,并获取当前目录

    当我们用cmd时,有时要切换到某个文件夹的目录,可以在当前目录下,按住shift单击右键打开控制台,也可以在鼠标右键中添加cmd启动命令: 1.在开始搜索框输入regedit,打开注册表: 2.打开 ...

  6. AngularJS系统学习之$watch(监控)

    在scope的内置的所有函数中,用的最多的可能就是$watch函数了, 当你的数据模型中某一部分发生变化时,$watch函数可以向你发出通知. 你可以监控单个对象的属性,亦可以监控需要经过计算的结果( ...

  7. React-Native 基本环境的搭建

    看了一些RN资料,仅仅了解到人们对 RN(以下简称 React_native 框架) 的使用描述以及评价,就觉得RN是一个很不错的框架,值得学习.今天就开始写我的学习记录,也给大家分享一下.下面进入正 ...

  8. MVC 基本工具(Visual Studio 的单元测试、使用Moq)

    3.Visual Studio 的单元测试 有很多.NET单元测试包,其中很多是开源和免费的.本文打算使用 Visual Studio 附带的内建单元测试支持,但其他一些.NET单元测试包也是可用的. ...

  9. VR相关学习资源

    ptgui全景图制作工具 http://blog.csdn.net/xoyojank mems陀螺误差补偿的算法研究 http://www.docin.com/p-619540171.html 极客工 ...

  10. 开源Html5+Websocket+Mqtt实时聊天室

    本应用示例使用Coolpy7作为Mqtt服务器并启用Websocket代理完美支持高并发大流量即时通过能力,本示以即时通信聊天为为例.还可以应用到其他软件应用如:网页客服系统.网站信息通知.网页即时通 ...