Professional C# 学习笔记之内存管理和指针

1.stack存储值数据类型,heap存储引用数据类型。
2.引用分配在stack上,而引用所对应的实例分配在heap上。
3.垃圾收集器在释放了它能释放的所有对象后,就会压缩其他对象,把他们都移动回heap的端部,再次形成一个连续的块。
4.有析构函数的对象需要垃圾收集器两次处理才能删除:第一次调用析构函数时,没有删除对象,第二次调用才真正删除对象。
5.由于垃圾收集器的工作方式,无法确定C#对象的析构函数何时执行。
6.可实现IDisposable接口的Dispose()来显示释放由对象使用的所有未托管资源。
7.要用指针,请先用unsafe标记。Unsafe可以标记方法、类、结构、成员和代码块,但不能标记局部变量。
8.C#中int* pX,pY等价于C++中 int *pX,*pY。
9.不允许针对void指针执行算术运算。
10.sizeof只能用于不安全代码块,且不能对类使用。
11.不能创建指向类的指针,这是因为垃圾收集器不包含指针的任何信息,只包含引用的信息,因此创建指向类的指针会使垃圾收集器不能正常工作。
12.int* pX = &(myObject.X);这样的表达式是错误的,因为在垃圾收集的过程中,垃圾收集器会把myClass移动到内存的一个新单元,这样,pX会指向错误的存储单元。解决方法是使用fixed关键字。fixed(int* pX=&(myObject.X))(//do something}。这样,垃圾收集器知道,在执行fixed块的代码是,不能移动myObject对象。
13.创建基于stack的数组。int* pInt = stackalloc int [10];

posted on 2006-01-01 20:06  ZFLIER'S BLOG  阅读(192)  评论(0)    收藏  举报

导航