2011-08-25 121 views
4
IFSUPCUTILSize* size = NULL; 
CoCreateInstance(CLSID_UTILSize, NULL, CLSCTX_INPROC_SERVER, IID_IFSUPCUTILSize, reinterpret_cast<void**>(&size)); 

if (size != NULL){ 
size->Release(); 
size = NULL; 
} 
delete size; 

是否需要上面代码中的“删除大小”? 如果我包含“删除大小”,我会因为没有使用New而导致内存泄漏。 或者在调用CoCreateInsatnce的过程中是否有新内容。 我用VC++ 6编译这个。内存泄漏 - 释放和删除

+2

您可能想要升级到更新版本的Visual Studio。 – GManNickG

回答

9

COM接口被引用计数。 CoCreateInstance()返回一个接口指针,该指针指向已经增加了引用计数的COM对象。调用Release()减少引用计数。当引用计数降到零时,COM对象将自动释放。不要在COM接口指针上调用delete!只能使用Release()

+0

谢谢。对我好的教育。 OP – dysonfree

4

从C++的角度来看,你所做的很好。调用空指针上的删除操作是无操作的。但是,这是不必要的。

从VC++ 6的角度来看,我不能说,它是非常不合规的。我无法想象为什么它可能是一个问题,但。但是,再次,这肯定是不必要的。

绝对不要在该指针设置为NULL之前调用delete。你没有分配新的,所以不要调用删除。这里的资源管理由COM功能负责。

-1

我假设size-> Release()释放OS资源(文件句柄等)。因此,在将大小设置为空之前立即将删除大小。

+3

他没有用新的分配,他不应该调用删除它。 –

+0

我继承了代码。我检查了其余的代码。指针在下一行中释放并设置为null。我把自己从无知中加入。我想有一个兼容的编译器没有什么坏处。但MS,我最好删除它。我同意如果我没有新的,我不需要删除。谢谢。这个论坛很棒。 – dysonfree

0

如果我包含“删除大小”,我会因为没有使用New而导致内存泄漏。

您通常不会通过调用delete来获得内存泄漏。你可以和很多时候得到内存损坏。这两者是非常不同的:内存泄漏意味着你的程序保存到内存中,它实际上并没有使用,随着时间的推移,如果泄漏的内存继续增长,程序可能会崩溃;内存损坏意味着你以某种方式在内存中破坏了重要的簿记结构,很可能很快就会崩溃(至少你应该希望崩溃,另一种情况会更糟)。 One very common cause of memory corruption is deallocating memory with the wrong routine,特别是在Windows上(在UNIX上重新定义mallocfree是一种传统,所以UNIX系统often go out of their way to make sure it's possible to do that)。

还是有新的呼叫内部CoCreateInstance的

不管里面CoCreateInstance应由Release()处理。至少,你不应该因为你有一个指针而释放内存。您需要知道他们如何分配内存才能正确释放内存。

+0

谢谢。非常清楚地解释。 – dysonfree

1

千万不要试图使用delete来释放由另一个模块实现的COM服务器(这是你的情况)。

  1. 您并不总是知道该服务器是否用C++编写。在非C++对象上执行delete是未定义的行为。
  2. 即使服务器是用C++编写的,您也不知道它是在哪个堆上分配的,以及delete是否会正确释放内存或触发未定义的行为。
  3. 您可以调用delete上的一个接口指针,声明为没有虚拟析构函数 - 这是未定义的行为。
  4. 你不知道你是否曾经服过一个真实的物体或代理。在代理上执行delete是未定义的行为。
  5. 一旦您调用Release()对象可能已经自我删除,并且再次执行delete是未定义的行为。
  6. 某些第三方可能拥有该对象的所有权 - 例如,某个全局指针实例可能已设置为您的对象。如果您delete那些其他指针将变得悬而未决,并且可能稍后会导致未定义的行为。

底线:在这种情况下不要使用delete。致电Release()释放对象的所有权,这就足够了。