RCW 生存期控制

RCW是.net 对com的包装,比如office就是通过RCW来被.net调用的。可以百度:office pia 了解更多信息。

RCW 是一个.net类。

1.关闭线程对rcw的自动清理

System.Threading.Thread.CurrentThread.DisableComObjectEagerCleanup();

2.立即清理rcw

System.Runtime.InteropServices.Marshal.CleanupUnusedObjectsInCurrentContext();

不过经过实际测试,没发现有什么作用,还没有摸索出应用场合。但是可以肯定的是,立即清理rcw并不会清理rcw,至少还活着(被引用)的rcw不会被清理。

在析构函数执行阶段:

如果你代码中用了析构函数,试图清理rcw对象,这个做法可能不如你想象中达成。

rcw是一个.net 对象,所有.net 对象的析构函数的执行顺序是不确定的,也就是你想用析构函数去操控rcw,而rcw可能自身已经释放了。这里面的释放并不是说rcw已经死亡,而是说rcw对com的引用关系已经释放,你再调用它包装的com对象的任意成员,都会引发:System.Runtime.InteropServices.InvalidComObjectException,提示:COM 对象与其基础 RCW 分开后就不能再使用。

究竟rcw是选择怎样的时机释放com的,我不得而知,估计也是类似使用虚构函数或者被GC直接回收(但因为我的析构函数有它的引用应该不会)。有虚构函数的对象会比没有的回收速度要慢一级。

另外,rcw并不是真的正确释放了com,com对象还是存在的,只是rcw不能控制。

如何让rcw正确清理,这个rcw是否提供什么机制,这点没搞清楚。但是客户类只能通过显式的dispose接口来写清理代码,并正确调用。

虽然很有很多迷雾,为了帮助后人探索,记录至此。

时间: 2024-12-28 00:55:17

RCW 生存期控制的相关文章

C++中智能指针的设计和使用

转载请标明出处,原文地址:http://blog.csdn.net/hackbuteer1/article/details/7561235      智能指针(smart pointer)是存储指向动态分配(堆)对象指针的类,用于生存期控制,能够确保自动正确的销毁动态分配的对象,防止内存泄露.它的一种通用实现技术是 使用引用计数(reference count).智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象共享同一指针.每次创建类的新对象时,初始化指针并将引用计数置为

指针辨析:悬垂指针、哑指针、野指针、智能指针

悬垂指针: 1:提出的原因: 请看下面的代码片段: [cpp] view plaincopyprint? int *p=NULL; void main() { int i=10;p=&i; cout<<"第一次:*p = "<<*p<<endl; cout<<"第二次:*p = "<<*p<<endl; } [cpp] view plaincopyprint? int *p=NULL;

C++ 智能指针详解 二

智能指针(smart pointer)是存储指向动态分配(堆)对象指针的类,用于生存期控制,能够确保自动正确的销毁动态分配的对象,防止内存泄露.它的一种通用实现技术是使用引用计数(reference count).智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象共享同一指针.每次创建类的新对象时,初始化指针并将引用计数置为1:当对象作为另一对象的副本而创建时,拷贝构造函数拷贝指针并增加与之相应的引用计数:对一个对象进行赋值时,赋值操作符减少左操作数所指对象的引用计数(如果

c++11改进我们的程序之垃圾回收(一)

c#和java中有自己主动垃圾回收机制,.net执行时和java虚拟机能够管理分配的堆内存,在对象失去引用时自己主动回收,因此在c#和jva中,  内存管理不是大问题.c++语言没有垃圾回收机制,必须自己去释放分配的堆内存,否则就会内存泄露. 我相信大部分c++开发者都遇到过内存泄露的问题,而查找内存泄露的问题往往要花大量的精力.要解决这个让人头疼的问题可  以採取一些办法,最有效的办法是使用智能指针!使用智能指针就不会操心内存泄露的问题了,由于智能指针能够自己主动删除删除分 配的内存. 智能指

com关于IUnknown接口

com定义的每个接口都必须从IUnknown继承过来,主要原因是IUnknown接口提供了两个很重要的特性:生存期控制和接口查询. 客户程序仅仅能通过接口与com对象进行通信.尽管客户程序能够无论对象内部的实现细节.但它要控制对象的存在与否. 假设客户还要继续对对象进行操作.则它必须保证对象能一直存在于内存中:假设客户对对象的操作已经完毕.以后也不再须要该对象了,则它必须及时地把对象释放掉.以提高资源的利用率.IUnknown引入了"引用计数"方法,能够有效得控制对象的生存周期. 还有

boost智能指针之shared_ptr和weak_ptr

std::auto_ptr很多的时候并不能满足我们的要求,比如auto_ptr不能用作STL容器的元素.boost的smart_ptr中提供了4种智能指针和2种智能指针数组来作为std::auto_ptr的补充. shared_ptr<boost/shared_ptr.hpp>:使用shared_ptr进行对象的生存期自动管理,使得分享资源所有权变得有效且安全. weak_ptr<boost/weak_ptr.hpp>:weak_ptr 是 shared_ptr 的观察员.它不会干

(转)C++11里的智能指针

1. std::auto_ptr有些违背c++编程思想. 已经被"不建议使用了".2. 下文转自:http://blog.csdn.net/lanergaming/article/details/24273419 c#和java中有自动垃圾回收机制,.net运行时和java虚拟机可以管理分配的堆内存,在对象失去引用时自动回收,因此在c#和jva中, 内存管理不是大问题.c++语言没有垃圾回收机制,必须自己去释放分配的堆内存,否则就会内存泄露. 我相信大部分c++开发人员都遇到过内存泄露

com组件接口

int main( int argc, char *argv[] ) {    cout << "Initializing COM" << endl;    if ( FAILED( CoInitialize( NULL )))    {       cout << "Unable to initialize COM" << endl;       return -1;    }    ISampleMath* pSa

COM 组件接口的 IUnKnown 接口介绍

IUnKnown是一个接口. 所有COM接口都继承IUnKnown.IUnKnown的定义在WIN32 SDK中的UNKNWN头文件中.其定义如下: interface IUnKnown { virtual HRESULT __stdcall QueryInterface(const IID& iid,void **ppv)=0; virtual ULONG __stdcall AddRef()=0; virtual ULONG __stdcall Release()=0; } IUnKnown