易截截图软件、单文件、免安装、纯绿色、仅160KB

[C/C++ Digestion] – 自底向上地探究虚函数


[C/C++ Digestion] –
自底向上地探究虚函数
作者:
Jason Lee @
http://blog.csdn.net/jasonblog
日期:
2010-05-19
环境:
Visual C++ Express
2008
声明:本文发表在
csdn
博客,如有转载,请注明出处
 
[1]C++
对象模型基础
一个类中可以包含静态数据成员、静态成员函数、非静态成员函数和非静态数据成员以及虚函数。其中,前三者(静态数据成员、静态成员函数、非静态成员函数)都并没有被放到对象的布局中,可以从以下两段代码得到验证:
#include <iostream>
using namespace std;

class Base {
};

int main(){
Base a;
cout << sizeof (a) << endl;// 输出1
return 0;
}
上述的
Base
类是一个空类,占据了一个字节的内存空间,这是为了保证每个类实例化后都拥有独一无二的内存空间。接着我们往
Base
类中添加静态数据成员、静态成员函数和非静态成员函数:
#include <iostream>
using namespace std;

class Base {
public :
Base(){}
~Base(){}
static int v1;
static void f1(){}
void f2(){}
};

int main(){
Base a;
cout << sizeof (a) << endl;// 仍然输出1
return 0;
}
在经过内容填充后,
Base
类的实例
a
仍然仅占据
1
个字节的内存空间,与空类无异,这说明了静态数据成员、静态成员函数和非静态成员函数并未被放在对象的内存布局当中

接下来往类中添加非静态数据成员:
#include <iostream>
using namespace std;

class Base {
public :
int a;
int b;
};

int main(){
Base a;
cout << sizeof (a) << endl;// 输出8
cout << hex << &a << endl;// 输出0012F 3CC
cout << hex << &a.a << endl;// 输出0012F 3CC
cout << hex << &a.b << endl;// 输出0012F 3D0
return 0;
}
从上面的代码可以看出:一,非静态数据成员是会被放到对象的内存布局中;二,数据成员是根据声明顺序有序地在内存中进行分布的;三,在没有虚函数的情况下对象所占据的内存大小就是数据成员所占据的空间之和。布局如下图:
a
b
那么如果添加了虚函数以后呢?先看一段代码:
#include <iostream>
usin


相关文档:

Window+GCC+CDT用Eclipse开发C、C++

Eclipse除了可以開發Java之外,還支援了許多語言,現在先介紹
C、C++的開發環境設定,以後有機會再介紹其它的。Enjoy it!
OS:Windows XP Professional SP1
使用版本:Eclipse 2.1.2
一.首先要下載CDT,Eclipse 2.1.2 ......

linux c 读取文件行数

linux c 读取文件行数参照wc 系统命令编写的函数如下:
#include <fcntl.h>
#include <stdlib.h>
#define MAXBSIZE 65536
u_long file_wc(char *file)
{
register u_char *p;
register short gotsp;
register int ch, len;
register u_long linect, charct;
int fd;
u_char buf[MAXBSIZE];
......

解决C和C++中生成的EXE文件执行后窗口就消失了!

用此法前确保你的C源代码是无错的~~
解决办法:
C:
在主函数后加getch()或ch=getch();    (让程序等待你按下任意键,再继续执行下面的语句)
C++:
1.包含头文件时: #include   <stdlib.h>/*header file,因为在stdlib.h头文件中定义了system()函数*/
2.在最后一句加上:system("PAUSE ......

浅谈C/C++内存泄漏及其检测工具

BoundsChecker采用一种被称为 Code Injection的技术,来截获对分配内存和释放内存的函数的调用。简单地说,当你的程序开始运行时,BoundsChecker的DLL被自动载入进程的地址空间(这可以通过system-level的Hook实现),然后它会修改进程中对内存分配和释放的函数调用,让这些调用首先转入它的代码,然后再执行原来的代码。Bo ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号