一种内存泄漏的代码

内存泄漏的地方经常比较隐秘,今天就遇到了一回。问题出在delete (void*)上面,示例代码如下:

class Detect
{
public:
    Detect()
    {
        m_n1 = 0;
        m_n2 = 0;
        m_data.resize(10 , 0);
    }
    virtual ~Detect()
    {
    }

protected:
    int m_n1;
    int m_n2;
    deque<short> m_data;
};

class Monitor
{
public:
    Monitor()
    {
        m_pDetect = new Detect;
    }
    ~Monitor()
    {
        if (m_pDetect != 0)
        {            // 加上这行代码就避免泄漏内存
            //((Detect*)m_pDetect)->~Detect();
            delete m_pDetect;
            m_pDetect = 0;
        }
    }

    bool detect()
    {
        return true;
    }

protected:
    void* m_pDetect;
};
时间: 2024-11-01 17:43:16

一种内存泄漏的代码的相关文章

记一道面试题:手写一个内存泄漏的代码,如何修正

前几天面试的时候被问到手写一个内存泄漏的代码,并且如何修正,当时有点蒙,后来面试官写了三行代码,如下 1 Object obj1=new Object(); 2 Object obj2=new Object(); 3 obj1=obj2; 试分析是否出现内存泄漏,为什么, 首先,先了解一下内存泄漏是什么?百度百科给了一个答案 简单的说就是我们已经不需要的对象,它没有被清理,依旧存在堆内存中.但是项目一旦运行又不会时长终止,那么这个对象就会一直存在,占用空间也会进行累计. 上面的代码是存在内存泄漏

Linux下c++程序内存泄漏检测代码范例

Linux下对于程序内存泄漏检测的方法很多,最常用的的莫过于使用valgrind工具.但是valgrind相当于让程序在虚拟机中运行,会带来较大的系统资源开销,还会对程序的运行效率产生较大影响,对于那种资源占用大的程序,如果需要长时间运行才能暴露的泄漏问题,它就显得不太好用. linux下的c++程序中自己实现一个轻量级的泄漏检测代码其实是比较方便的,下面我就给出一个简单的范例,并作简单的说明.当然,我们还是应该提倡使用共享指针,用共享指针自动管理内存可以避免内存泄漏这样的不必要的麻烦. 基本原

linux中内存泄漏的检测(五)记录内存泄漏的代码

到目前为止,先后通过wrap malloc.new函数重载和计算指针内存大小的方法,基本上满足了对内存泄漏检测的需要. 如果发现了内存泄漏,那么就要找到内存泄漏的地方并且修正它了. 茫茫代码,如何去找?如果能根据未释放的内存找到申请它的地方就好了. 我们今天就是要做这个事情. 想要根据内存地址查出申请者的信息,那么在一开始申请的时候就要建立地址与申请者之间的映射. 1.内存地址 内存地址,是一个unsigned long型的数值,用void *来存储也可以.为了避免类型转换,我使用了void *

(转)从内存管 理、内存泄漏、内存回收探讨C++内存管理

http://www.cr173.com/html/18898_all.html 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对 C++的痛恨,但内存管理在C++中无处不在,内存泄漏几乎在每个C++程序中都会发生,因此要想成为C++高手,内存管理一关是必须要过的,除非放弃 C++,转到Java或者.NET,他们的内存管理基本是自动的,当然你也放弃了自由和对内存的支配权,还放弃了C++超绝的性能

Android内存泄漏的本质原因、解决办法、操作实例

今年最后一个迭代终于结束了,把过程中碰到的不熟悉的东西拉出来学习总结一下 内存泄漏的本质是:[一个(巨大的)短生命周期对象的引用被一个长生命周期(异步生命周期)的对象持有] 这个东西分为两个部分 获得一个(巨大的)短生命周期的对象 这个[巨大的短生命周期的对象]在Android中最有可能的就是[Activity]了 最容易无意识获得它的方式就是[非静态内部类隐式自动持有外部类的强引用] 把这个对象赋值给了一个长生命周期的对象 这个有一些常见的套路 套路一:直接赋值给了一个类的静态成员 这个静态成

Handler系列之内存泄漏

本篇简单的讲一下平常使用Handler时造成内存泄漏的问题. 什么是内存泄漏?大白话讲就是分配出去的内存,回收不回来.严重会导致内存不足OOM.下面来看一下造成内存泄漏的代码: public class MemoryLeakActivity extends Activity { private MyHandler mHandler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(save

JavaScript 中的内存泄漏

JavaScript 是一种垃圾收集式语言,这就是说,内存是根据对象的创建分配给该对象的,并会在没有对该对象的引用时由浏览器收回.JavaScript 的垃圾收集机制本身并没有问题,但浏览器在为 DOM 对象分配和恢复内存的方式上却有些出入. Internet Explorer 和 Mozilla Firefox 均使用引用计数来为 DOM 对象处理内存.在引用计数系统,每个所引用的对象都会保留一个计数,以获悉有多少对象正在引用它.如果计数为零,该对象就会被销毁,其占用的内存也会返回 给堆.虽然

内存溢出和内存泄漏

内存溢出是指程序在申请内存时,系统并没有给足够的内存来供其使用,OUT OF MEMORY. 内存泄漏是自己向系统申请了内存空间但是使用完之后没有释放掉,结果那块内存自己不能使用,系统也不能在分配给其他程序再使用了. 一次内存泄漏可以忽略,但是多次的内存泄漏终将导致内存溢出. 内存泄漏可以分为4种: 1.常发性内存泄漏,发生内存泄漏的代码会被多次访问到,每次被执行的时候都会导致一块内存泄漏. 2.偶发性内存泄漏.发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生.常发性和偶发性是相对的.对

vld,Bounds Checker,memwatch,mtrace,valgrind,debug_new几种内存泄露检测工具的比较

概述 内存泄漏(memory leak)指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况,在大型的.复杂的应用程序中,内存泄漏是常见的问题.当以前分配的一片内存不再需要使用或无法访问时,但是却并没有释放它,这时就出现了内存泄漏.尽管优秀的编程实践可以确保最少的泄漏,但是根据经验,当使用大量的函数对相同的内存块进行处理时,很可能会出现内存泄漏. 内存泄露可以分为以下几类:1. 常发性内存泄漏.发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏.2. 偶发性内存泄漏.发生