[转] 浅谈C++中的那些内存泄露
尽管学过C语言。可是C++里面的一些基础还是不太懂,还须要再掌握。
对于内存泄露,我的个人理解就是程序在执行过程中,自己开辟了空间,用完这块空间后却没有释放。
今晚上我就犯了这种低级错误,导致程序没有执行出来。还是先看代码:
#include <iostream>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
class person{
public:
person(){
cout<<"基类构造函数运行中.....\n";
}
~person(){
cout<<"基类析构函数运行中.....\n";
}
};
class DS:public person{
public:
DS(){
cout<<"派生类构造函数运行中.....\n";
}
~DS(){
cout<<"派生类析构函数运行中.....\n";
}
};
int main(int argc, char** argv) {
DS p;
return ;
}
这段代码是没有问题的,程序開始从main函数执行,实例化派生类DS一个对象p。无论怎样。派生类DS总先调用基类person的构造函数,然后派生类DS在调用自己的构造函数,接着是自己的析构函数,最后是基类person的构造函数,执行结果例如以下图所看到的:
事实上嘛,这个什么时候调基类构造(析构)。什么时候调派生类构造(析构)。我个人的理解能够用简单的图来表示了。基类构造和析构就像一个大框架包括着派生类的构造和析构:
1. 对于上述的程序我在main函数中继续改动,假设new了。却没delete。(用匹配和兼容任意,结果还是一样的)
int main(int argc, char** argv) {
DS *p=new DS();
// person *p= new DS();
return ;
}
这时候就出现故障了,假设在C++中。就会出现以下的结果:
原因是new了,却不没delete,造成内存泄露。在程序执行过程中析构函数是不会调用的,直到整个程序结束。系统才会自己主动释放内存。
2. 对于上述的程序我在main函数中继续改动,这次加上delete p,如今匹配的情况下操作。也就是派生类的指针指向派生对象:
int main(int argc, char** argv) {
DS *p=new DS();
delete p;
return ;
}
执行结果大家也应该猜的出来,4个全有
3. 对于上述的程序我在main函数中继续改动,这次利用兼容,即就是基类指针指向派生类的对象:
<strong>int main(int argc, char** argv) {
person *p=new DS();
delete p;
return ;
}</strong>
可是这次又出现故障了,执行结果中没有派生类的析构函数,这都是兼容惹的祸,由于基类指针仅仅能指向派生类继承自己的那一部分,对于派生类DS那一部分,基类指针映射不到。所以就不去调用它,演示结果例如以下:
要解决这问题实际不难。这个时候就要。基类指针就基类指针,管他三七二十一的。我这个时候仅仅要在基类person的析构函数中加一个virtual(虚特性)。尽管在main函数中,还是第三中情况。我也能够轻轻松松的输出以下的结果:
事实上这个里面涉及到了。继承(兼容规则),多态的知识,在C++涉及模式中,95%都用到了多态性,无疑这是C++的重点,一定要好好学习这一块。
对于继承和多态的相关知识下一个博客在说吧,那个就要大写特写了,,哈哈,那是一个非常有意思的举例——媳妇炒菜,工厂模式,慢慢的就进入C++的核心中去了。。
接下来。关于C++中,指针delete删除值得问题。这一块有必要说一下:
先把代码发上去在说吧
#include <iostream>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
int main(int argc, char** argv) {
int *p;
p=new int;
*p=;
cout<<"输出值*p= "<<*p<<endl;
cout<<"输出地址p= "<<p<<endl;
delete p; //delete p 之后
cout<<"delete p 之后输出值*p= "<<*p<<endl;
cout<<"delete p 之后输出地址p= "<<p<<endl;
return ;
}
我定义了一个整型指针p。new了一块int型的整型单元,并给*p赋值3,之后呢,输出*p和p的地址。之后我在delete p。事实上我们每次delete实际上是删除的是p指向那块空间的值。并没有删除它的地址,因此才会出现以下的结果演示:
好了,我的能力有限就仅仅能写到这里了,以后遇到问题在完好,不正确的地方也要改动。,睡觉了,,。瞌睡死了,。,,
[转] 浅谈C++中的那些内存泄露的更多相关文章
- 浅谈C++中的那些内存泄露
尽管学过C语言.可是C++里面的一些基础还是不太懂,还须要再掌握. 老范也開始要讲C++设计模式了,必须快点看了.不然就要白花窝滴钱了. 对于内存泄露,我的个人理解就是程序在执行过程中,自己开辟了空间 ...
- 浅谈C++中内存泄漏的检测
首先我们需要知道程序有没有内存泄露,然后定位到底是哪行代码出现内存泄露了,这样才能将其修复.最简单的方法当然是借助于专业的检测工具,比较有名如BoundsCheck,功能非常强大,相信做C++开发的人 ...
- 浅谈Java中的equals和==(转)
浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str ...
- 浅谈Java中的equals和==
浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: String str1 = new String("hello"); String str2 = ...
- 浅谈JavaScript中的闭包
浅谈JavaScript中的闭包 在JavaScript中,闭包是指这样一个函数:它有权访问另一个函数作用域中的变量. 创建一个闭包的常用的方式:在一个函数内部创建另一个函数. 比如: functio ...
- 浅谈Java中的深拷贝和浅拷贝(转载)
浅谈Java中的深拷贝和浅拷贝(转载) 原文链接: http://blog.csdn.net/tounaobun/article/details/8491392 假如说你想复制一个简单变量.很简单: ...
- 浅谈Java中的深拷贝和浅拷贝
转载: 浅谈Java中的深拷贝和浅拷贝 假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(bool ...
- 浅谈Android应用性能之内存
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 文/ jaunty [博主导读]在Android开发中,不免会遇到许多OOM现象,一方面可能是由于开 ...
- 浅谈C中的malloc和free
转自http://bbs.bccn.net/thread-82212-1-1.html非常感谢作者 浅谈C中的malloc和free 在C语言的学习中,对内存管理这部分的知识掌握尤其重要!之前对C中的 ...
随机推荐
- select 后台获取text 并根据text 设置value选中项
-------获取select 的text string orderNo = this.orderNo.Items[this.orderNo.SelectedIndex].Text; -----根据t ...
- POJ3169
题目链接:http://poj.org/problem?id=3169 AC思路: spfa算法. 设各牛的位置为x[ ]. 对于感情好的牛,即第2到ML+1行:A B D, 有x[B] - x[A] ...
- element 的 Cascader 级联选择器设定默认值
Cascader 级联选择器 发现在很多的CRM管理系统里面,都有不少页面是用到这种级联选择器的,确实,功能很实用, 不过要设置默认值则应该让不少人头痛,因为你选择的时候 @change 事件的参数就 ...
- unicode 的中文字符串,调用 isalnum()返回的是 True ?
描述 Python isalnum() 方法检测字符串是否由字母和数字组成. 语法 isalnum()方法语法: str.isalnum() 返回值 如果 string 至少有一个字符并且所有字符都是 ...
- JVM调优总结(三)-垃圾回收面临的问题
如何区分垃圾 上面说到的“引用计数”法,通过统计控制生成对象和删除对象时的引用数来判断.垃圾回收程序收集计数为0的对象即可.但是这种方法无法解决循环引用.所以,后来实现的垃圾判断算法中,都是从程序运行 ...
- Docker 入门:Dockerfile
主要内容: 什么是 Dockerfile 查看 DockerHub 中镜像的 Dockerfile Dockerfile 编写 Dockerfile 常用命令 什么是 Dockerfile 使用 Do ...
- This关键字练习
Account: package com.aff.ex; public class Account { private int id;// 账号 private double balance;// 余 ...
- 值得注意的Java基础知识
1)Java语言中默认(即缺省没写出)的访问权限,不同包中的子类不能访问. 中有4中访问修饰符:friendly(默认).private.public和protected. public :能被所有的 ...
- return break 和continue在for循环中的不同作用
平时自己经常在函数里见到return,在switch语句中使用break,而continue则用的不多. 其实这三者都能在for循环中发挥不同的作用,让代码更加灵活. 先说return return是 ...
- Xilinx ISE多功能移位寄存器仿真及Basys2实验板实验
移位寄存器实现Verilog代码: `timescale 1ns / 1ps module add( input clk, input reset, input [1:0] s, input dl, ...