1

例如,当我们从类型库创建对象时

SomeClassPtr some_obj(__uuidof(SomeImplementation));

some_obj 是在堆还是栈上创建的?我的意思是它像

SomeClassPtr *some_obj = new SomeImplementation();
4

3 回答 3

5

错误的思考方式。不是堆栈。

但这就是猜测结束的地方。此 COM 对象可能存在于不同的进程中。或者在地球另一端的机器上。你得到的只是一个接口指针,它指向什么你不知道。可能是在堆上分配的实际对象。可能是与位于其他地方的存根对话的代理。其他任何地方。这是一个特性,避免关心它。

于 2013-05-27T18:04:08.510 回答
1

在这种情况下,您的“指针” ( SomeClassPtr) 指向将被堆分配的内存块。

但是,它不一定执行堆分配,因为它实际上是处理分配和释放的引用计数类型(通过IUnknown::AddRefIUnknown::Release)。这意味着它可能正在获取和增加先前分配的对象的引用计数,具体取决于存储在 COM 指针中的类型。

于 2013-05-27T17:48:13.570 回答
0

实际上,它比这更复杂一些。

严格来说,第一个例子是栈变量,第二个例子是堆变量(假设 new 没有被覆盖。

奇怪的部分发生了,因为根据 COM 的性质,您不知道发生了什么、在哪里或是否(如果结果是 AddRef,例如,可能没有)任何其他分配发生;特别是,对于需要跨越线程/进程边界的分配(对于进程外服务器总是如此),IMalloc::Alloc (CoTaskMemAlloc()) 的默认实现是从实际创建/实例化 COM 对象的过程。

正如在其他地方指出的那样,这是一个功能;你不应该关心。

于 2013-05-27T18:08:16.223 回答