例如,当我们从类型库创建对象时
SomeClassPtr some_obj(__uuidof(SomeImplementation));
some_obj 是在堆还是栈上创建的?我的意思是它像
SomeClassPtr *some_obj = new SomeImplementation();
例如,当我们从类型库创建对象时
SomeClassPtr some_obj(__uuidof(SomeImplementation));
some_obj 是在堆还是栈上创建的?我的意思是它像
SomeClassPtr *some_obj = new SomeImplementation();
错误的思考方式。不是堆栈。
但这就是猜测结束的地方。此 COM 对象可能存在于不同的进程中。或者在地球另一端的机器上。你得到的只是一个接口指针,它指向什么你不知道。可能是在堆上分配的实际对象。可能是与位于其他地方的存根对话的代理。其他任何地方。这是一个特性,避免关心它。
在这种情况下,您的“指针” ( SomeClassPtr
) 指向将被堆分配的内存块。
但是,它不一定执行堆分配,因为它实际上是处理分配和释放的引用计数类型(通过IUnknown::AddRef
和IUnknown::Release
)。这意味着它可能正在获取和增加先前分配的对象的引用计数,具体取决于存储在 COM 指针中的类型。
实际上,它比这更复杂一些。
严格来说,第一个例子是栈变量,第二个例子是堆变量(假设 new 没有被覆盖。
奇怪的部分发生了,因为根据 COM 的性质,您不知道发生了什么、在哪里或是否(如果结果是 AddRef,例如,可能没有)任何其他分配发生;特别是,对于需要跨越线程/进程边界的分配(对于进程外服务器总是如此),IMalloc::Alloc (CoTaskMemAlloc()) 的默认实现是从实际创建/实例化 COM 对象的过程。
正如在其他地方指出的那样,这是一个功能;你不应该关心。