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