zoukankan      html  css  js  c++  java
  • [转] 浅谈C++中的那些内存泄露

    点击阅读原文

         尽管学过C语言。可是C++里面的一些基础还是不太懂,还须要再掌握。

         对于内存泄露,我的个人理解就是程序在执行过程中,自己开辟了空间,用完这块空间后却没有释放。

         今晚上我就犯了这种低级错误,导致程序没有执行出来。还是先看代码:

     1 #include <iostream>
     2 
     3 /* run this program using the console pauser or add your own getch, system("pause") or input loop */
     4 using namespace std;
     5 class person{
     6     public:
     7         person(){
     8             cout<<"基类构造函数运行中.....
    ";
     9         }
    10            ~person(){
    11             cout<<"基类析构函数运行中.....
    ";
    12         }
    13 }; 
    14 class DS:public person{
    15     public:
    16         DS(){
    17             cout<<"派生类构造函数运行中.....
    ";
    18         }
    19         ~DS(){
    20             cout<<"派生类析构函数运行中.....
    ";
    21         }
    22 };
    23 int main(int argc, char** argv) {
    24     
    25     DS p;
    26     return 0;
    27 }

    这段代码是没有问题的,程序開始从main函数执行,实例化派生类DS一个对象p。无论怎样。派生类DS总先调用基类person的构造函数,然后派生类DS在调用自己的构造函数,接着是自己的析构函数,最后是基类person的构造函数,执行结果例如以下图所看到的:

    事实上嘛,这个什么时候调基类构造(析构)。什么时候调派生类构造(析构)。我个人的理解能够用简单的图来表示了。基类构造和析构就像一个大框架包括着派生类的构造和析构:

    1. 对于上述的程序我在main函数中继续改动,假设new了。却没delete。(用匹配和兼容任意,结果还是一样的)

    1 int main(int argc, char** argv) {
    2     
    3 
    4     DS *p=new DS();
    5         // person *p= new DS();
    6     return 0;
    7 }

    这时候就出现故障了,假设在C++中。就会出现以下的结果:

    原因是new了,却不没delete,造成内存泄露。在程序执行过程中析构函数是不会调用的,直到整个程序结束。系统才会自己主动释放内存。

    2. 对于上述的程序我在main函数中继续改动,这次加上delete p,如今匹配的情况下操作。也就是派生类的指针指向派生对象:

    1 int main(int argc, char** argv) {
    2     
    3 
    4     DS *p=new DS();
    5      delete  p;
    6     return 0;
    7 }

    执行结果大家也应该猜的出来,4个全有

    3. 对于上述的程序我在main函数中继续改动,这次利用兼容,即就是基类指针指向派生类的对象:

    1 <strong>int main(int argc, char** argv) {
    2     
    3 
    4      person *p=new DS();
    5      delete  p;
    6     return 0;
    7 }</strong>

    可是这次又出现故障了,执行结果中没有派生类的析构函数,这都是兼容惹的祸,由于基类指针仅仅能指向派生类继承自己的那一部分,对于派生类DS那一部分,基类指针映射不到。所以就不去调用它,演示结果例如以下:

    要解决这问题实际不难。这个时候就要。基类指针就基类指针,管他三七二十一的。我这个时候仅仅要在基类person的析构函数中加一个virtual(虚特性)。尽管在main函数中,还是第三中情况。我也能够轻轻松松的输出以下的结果:

    事实上这个里面涉及到了。继承(兼容规则),多态的知识,在C++涉及模式中,95%都用到了多态性,无疑这是C++的重点,一定要好好学习这一块。

    对于继承和多态的相关知识下一个博客在说吧,那个就要大写特写了,,哈哈,那是一个非常有意思的举例——媳妇炒菜,工厂模式,慢慢的就进入C++的核心中去了。。

    接下来。关于C++中,指针delete删除值得问题。这一块有必要说一下:

    先把代码发上去在说吧

     1 #include <iostream>
     2 
     3 /* run this program using the console pauser or add your own getch, system("pause") or input loop */
     4 using namespace std;
     5 int main(int argc, char** argv) {
     6     int *p;
     7     p=new int;
     8     *p=3;
     9      cout<<"输出值*p= "<<*p<<endl;
    10      cout<<"输出地址p= "<<p<<endl;
    11      
    12      delete p;   //delete p 之后 
    13      
    14      cout<<"delete p 之后输出值*p= "<<*p<<endl;
    15      cout<<"delete p 之后输出地址p= "<<p<<endl;
    16      
    17            
    18      
    19     return 0;
    20 }

    我定义了一个整型指针p。new了一块int型的整型单元,并给*p赋值3,之后呢,输出*p和p的地址。之后我在delete p。事实上我们每次delete实际上是删除的是p指向那块空间的值。并没有删除它的地址,因此才会出现以下的结果演示:

    好了,我的能力有限就仅仅能写到这里了,以后遇到问题在完好,不正确的地方也要改动。,睡觉了,,。瞌睡死了,。,,

  • 相关阅读:
    python 单体模式 的几种实现
    python 相对路径导入 与 绝对路径导入
    python 优雅地实现插件架构
    tkinter 弹出窗口 传值回到 主窗口
    flask 与 vue.js 2.0 实现 todo list
    FormData 数据转化为 json 数据
    vue.js 2.0实现的简单分页
    一个神奇的实现:计算数组尾部对称长度
    flask, SQLAlchemy, sqlite3 实现 RESTful API 的 todo list, 同时支持form操作
    SQLAlchemy 关联表删除实验
  • 原文地址:https://www.cnblogs.com/outs/p/8964941.html
Copyright © 2011-2022 走看看