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覆盖掉了。