现在的位置: 首页 > 综合 > 正文

VC笔记2

2013年05月26日 ⁄ 综合 ⁄ 共 797字 ⁄ 字号 评论关闭

1.类中没有成员变量时,大小应该是0,但是0不好在内存中定位一个地址,所以规定大小为0的对象占一个字节

空间,一旦有成员变量,不会再增加这一个字节

2.成员函数不占空间,有vitrual函数的对象要维护一个指向vitual函数的函数表指针,所以要多占四个字节。

 

3.如果一个对象向父类方向向上强转,则它的内容会被切割和父类一样。

 

4.static成员不占对象存储空间,它存在堆中。

 

5 Unwinding:能在抛出异常,程序即将离开本模块而去执行catch中的语句时,对栈上的对象调用析构函数,注

意堆上的对象不可以,VC支持Unwinding

 

6.指针赋值为NULL后再访问它,就会出现访问Ox00000000冲突。

 

7.char *p = "abc"

   p[1] = 'd'

   会出现内存访问冲突,因为"abc"在常量区,不可变

   char p[] = "abc";

   p[1] = 'd';

   没问题,因为"abc"在栈上。

8.不同编译器的栈都会有一个最大空间限制,如果函数局部变量占用空间过多,会报错(即栈溢出),递归容易发

生栈溢出。堆 不会溢出,只会内存不足。

  函数调用层次过多也会栈溢出

 

16.内存越界会覆盖掉栈中正常的数据,非常危险。

 

17.内存泄漏是因为new的空间没有delete

 

18.栈的增长方向是从大到小,如果数据Data越界,则会覆盖先压入栈的数据

|---- -  |高地址  

|         |  

|----    |  

|data |  

|-----  |  

| ^      |低地址   

   |入栈方向

    19.申请一段内存后,windows会自动在其后加上四个FD(每个FD一个字节OxFD),如果内存越界,则必然会破坏

掉4个FD,则空间释放时会出错:   

char *c = new char[2]   

cin >> c;   

delete c;  

 输入"abc"则出错,因为"ab"后加'/0'把一个FD覆盖掉了。

【上篇】
【下篇】

抱歉!评论已关闭.