C++内存泄露,只是动态申请对象,然后delete就发生了内存泄露,真奇怪。

问题描述

C++内存泄露,只是动态申请对象,然后delete就发生了内存泄露,真奇怪。

今天写了个样例程序,程序主要是动态创建一个类的对象,存入list链表中,然后再把链表中的对象delete掉回收内存,理论上并不应该会产生内存泄露,但是从现象上来看确实是发生了内存泄露。程序启动后我分别在“创建对象前”、“创建对象后”、“释放对象内存后”三个阶段使用命令ps -aux|grep a.out查看了程序使用内存情况,发现在“释放对象内存后”阶段并没有释放对象的资源,回收内存。

使用命令查看程序使用内存情况如下:

[root@test2 ~]# ps -aux|grep a.out

Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ

root 37559 0.0 0.0 11752 960 pts/0 S+ 20:21 0:00 ./a.out

root 37561 0.0 0.0 105308 868 pts/2 S+ 20:21 0:00 grep a.out

[root@test2 ~]# ps -aux|grep a.out

Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ

root 37559 6.0 0.4 324328 313496 pts/0 S+ 20:21 0:00 ./a.out

root 37563 0.0 0.0 105308 872 pts/2 S+ 20:21 0:00 grep a.out

[root@test2 ~]# ps -aux|grep a.out

Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ

root 37559 4.6 0.4 324328 313540 pts/0 S+ 20:21 0:00 ./a.out

root 37565 0.0 0.0 105308 872 pts/2 S+ 20:21 0:00 grep a.out

[root@test2 ~]# ps -aux|grep a.out

Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ

root 37559 3.2 0.4 324328 313540 pts/0 S+ 20:21 0:00 ./a.out

root 37567 0.0 0.0 105308 868 pts/2 S+ 20:21 0:00 grep a.out

程序如下:

    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    #include <list>
    using namespace std;

    class basicClass
    {
    public:
            basicClass()
        {
            a = 0;
            b = 0;
            c = 0;
        }
        virtual ~basicClass()
        {
    //      cout<<"basic class releasen";
        }
    public:
        virtual int print()
        {
            cout<<"a:"<<a<<endl;
            return 0;
        }
    protected:
        int a;
        int b;
        int c;
        int arr;
    };

    int main(void)
    {
        printf("init statn");
        getchar();
        list<basicClass*> classList;
        for (int i = 0; i < 5000000; i++)
        {
            basicClass *pClass = new basicClass();
            classList.push_back(pClass);
        }

        printf("insert finishn");
        getchar();
        unsigned int i = 0;
        for (list<basicClass*>::iterator iter = classList.begin(); iter != classList.end(); iter++)
        {
            i++;
            delete *iter;
        }
        classList.clear();
        printf("release finishn");
        printf("release count:%dn", i);
        getchar();

            return 0;
    }

解决方案

已解决,在delete所有对象后调用mallo__trim(0)就好了。_

解决方案二:

释放对象内存后”阶段并没有释放对象的资源

解决方案三:

需要先调用析构函数,再释放内存吧。

解决方案四:

你有没有用到继承和多态呢?

解决方案五:

如果delete的是子类的指针对象,且有虚函数有多态,则必须在父类中将析构函数设置为virtual虚函数,否则delete的时候不会执行子类的析构函数(这个问题上周五才遇到过)
注意:父类不能用编译器提供的默认的析构函数,因为默认析构函数不是vtrtual函数

解决方案六:

调用析构函数才会使对象销毁,delete是内存的回收,但是指针还是指向销毁对象的那个内存,如果该指针继续使用就成了悬垂指针。所以我们在销毁对象,delete内存后,记得把指针赋为null。希望能帮到你,谢谢

时间: 2024-12-09 07:58:00

C++内存泄露,只是动态申请对象,然后delete就发生了内存泄露,真奇怪。的相关文章

释放动态申请数组内存-C++中动态申请的数组内存异常时内存释放问题

问题描述 C++中动态申请的数组内存异常时内存释放问题 在C++的一个方法中动态申请了一段数组的内存,还未通过delete[] 语句释放这段内存,方法异常,此时代码不会执行后面的delete[] 语句了,那么前面申请的这段数组内存怎么释放? C++中的auto_prt只支持单个对象动态内存的管理,对于数组动态申请的内存怎么管理? 解决方案 应该在运行期系统自动帮你归还,前提是你的数组是由class构成,但不是内置类型.详见EFFECTIVE C++第三版条款52(写了placement new也

内存分配-c++类的对象中分配的内存的内存能不能在在程序中间delete掉再重新分配?

问题描述 c++类的对象中分配的内存的内存能不能在在程序中间delete掉再重新分配? Matrix& Matrix::operator=(const Matrix &mp) { if (mp.row_n != row_n||mp.column_n != column_n) { std::cout << ""Error size not match"" << std::endl; return this; }/ for (in

c++-C++三维数组的动态申请

问题描述 C++三维数组的动态申请 我想动态申请一个三维数组,但是一定要使得存储的空间连续的,方便管理,不知道各位有什么看法. 有个一二维的例子可以参考: A **ga= new A* [m]; ga[0] = new A [m*n]; for(int i=1;i<m;++i) { ga[i]=ga[i-1]+n; } 那么这样的内存便是一整块方便管理的了,那么三维情况又如何呢? 解决方案 申请一维数组,构造3维数组的指针来访问 解决方案二: 申请一维数组,构造3维数组的指针来访问 解决方案三:

6.关于QT中的内存管理,动态的制作,动态库的调用,静态库的制作

 一  QT的内存管理 1  QT中的内存管理是QObject来管理的 2  QT中的内存管理没有cocos2dx中的引用计数 3  组件可以指定父对象 QTimer *timer = QTimer(this);   //这里的this实际上强制转换成为了QObject了. 4  每一个对象都有一个deleteLater()方法, QLineEdit* edit = new QLineEdit(this);   delete edit;   //这里的delete马上调用析构函数对内存进行释

UNIX下C++实现动态载入对象

VC里面实现动态对象载入已经不是什么新鲜事情了,很多的plug-in技术就是例子.Unix下,通过动态载入so获得一个对象也不是什么难事,不过对这个对象的管理就是一件比较麻烦的事情了.一般的需求如下:   有class TMyObj,准确说TMyObj应该是一个接口,根据不同具体情况会有不同的实现,例如 TMyObj1.TMyObj2等等--而这些TMyObj1和TMyObj2分别保存在不同的so当中,需要根据不同的时候load不同的so,建立相应的对象.由于这些对象都拥有TMyObj的接口,所

Android6.0动态申请权限所遇到的问题小结_Android

白天在做SDK23版本的适配,遇到了不少坑,现在抽空记下来,以此为戒. 首先要知道哪些坑,就得先了解一些定义和基本使用方式. 那么先介绍一下动态申请的权限分组情况. 下面的权限组是由谷歌官方定义的,目的是在申请权限时,只要用户允许同一权限组的任意一条权限,那么该组的其他权限也就默认是允许的.不过据高人介绍,在使用时最好是用到哪个权限就具体的请求该权限,因为保不齐哪天谷歌一高兴就把权限组换了甚至删了 group:android.permission-group.CONTACTS permissio

Android6.0动态申请权限所遇到的问题小结

白天在做SDK23版本的适配,遇到了不少坑,现在抽空记下来,以此为戒. 首先要知道哪些坑,就得先了解一些定义和基本使用方式. 那么先介绍一下动态申请的权限分组情况. 下面的权限组是由谷歌官方定义的,目的是在申请权限时,只要用户允许同一权限组的任意一条权限,那么该组的其他权限也就默认是允许的.不过据高人介绍,在使用时最好是用到哪个权限就具体的请求该权限,因为保不齐哪天谷歌一高兴就把权限组换了甚至删了 group:android.permission-group.CONTACTS permissio

Groovy高效编程:动态改变对象的能力

从Groovy1.1beta-2开始,实现动态改变对象的能力变的十分简单: 一开始,我们有这样一个类: class Person { String name } 该类的实例都是哑巴,不能说话,作为造物主的我们该完善它们,使它们能自我介绍(添加实例方法):class Person { String name } // 添加自我介绍的行为 Person.metaClass.introduce << {println "I'm $name"} 现在让我们看看,它们到底是否真的能够

PowerShell实现动态获取当前脚本运行时消耗的内存

  这篇文章主要介绍了PowerShell实现动态获取当前脚本运行时消耗的内存,本文直接给出实现脚本函数,需要的朋友可以参考下 想粗略地理解一个脚本消耗了多少内存,或着在你往PowerShell中的变量存结果时,消耗了多少内存,可以借助于下面的函数: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #requires -Version 2   $script:last_memory_usage_byte = 0