zoukankan      html  css  js  c++  java
  • C++ 释放指向类的void类型指针造成内存泄漏

    先来看一段代码

    #include <iostream>
    using namespace std;

    class A
    {
    public:
    A(){
    cout << "A() ...." << endl;
    }
    ~A()
    {
    cout << "~A()...." << endl;
    }
    void func()
    {
    cout << "a --> func()...." << endl;
    }
    };


    class MyAutoPtr //定义一个指向A类的智能指针
    {
    public:
    MyAutoPtr(void* ptr) //ptr = new A;
    {
    this->m_p = ptr;
    }

    ~MyAutoPtr()
    {
    if (this->m_p != NULL) {
    cout << "delete m_p" << endl;//打印信息,表示已运行MyAutoPtr类的析构函数
    delete m_p;
    }
    }
    private:
    void* m_p;//指向A对象的地址。
    };



    void test()
    {
    MyAutoPtr auto_p(new A); //创建一个对象,并在test函数结束时销毁

    }



    int main(void)
    {
    test();

    return 0;
    }
    输出结果如下

    A() ....
    delete m_p
     

    这段代码中MyAutoPtr类中有一个void类指针m_p指向类A,最后在对象auto_p销毁时调用MyAutoPtr类中析构函数释放掉m_p指向的内存即类A,按理来说是会调用类A的析构函数进行进一步的释放,但是输出结果表示系统只运行到了MyAutoPtr类中的析构函数,并未调用类A的析构函数,这就造成了类A的内存并未被释放。

    若将MyAutoPtr类中的指针m_p改为A类型,再次运行就显示正确的调用了类A的析构函数。

    由此可知,若一个void类型指针指向了一个类,那么系统在释放这个指针时并不会调用该类中的析构函数去释放内存,会造成内存泄漏。这也是为什么C++中模板类大多需要调用者在调用时显式标注数据类型的原因。
    ————————————————

  • 相关阅读:
    Vue中v-on的指令以及一些其他指令
    Vue模板语法中数据绑定
    Vue介绍以及模板语法-插值
    JQ中的Ajax的封装
    跨域问题的解决?
    Ajax的快速入门
    如何使用npm的部分用法以及npm被墙的解决方法
    使用Node.js简单创建一个服务器
    机智云连接ESP8266--远程控制点亮RGB灯
    1、索引的概念和分类
  • 原文地址:https://www.cnblogs.com/lidabo/p/12201800.html
Copyright © 2011-2022 走看看