内存泄漏-释放和删除
Memory leak - release and delete
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;
我需要"delete size"在上面的代码中?如果我包含了"delete size",是否会因为没有使用New而导致内存泄漏?或者在对CoCreateInstance
的调用中有一个New。
COM接口是引用计数的。CoCreateInstance()
返回一个接口指针,指向一个引用计数已经增加的COM对象。调用Release()
会减少引用计数。当引用计数降为零时,COM对象将自动释放自身。不要在COM接口指针上调用delete
!始终只使用Release()
从c++的角度来看,你所做的是好的。在空指针上调用delete是无操作的。然而,这是不必要的。
从vc++ 6的角度来看,我不能说,它是出了名的不兼容。我无法想象为什么这可能是一个问题。但是,这当然是没有必要的。
在这个指针被设置为NULL之前,绝对不要对它调用delete。你没有分配new,所以不要调用delete。这里的资源管理由COM函数负责。
永远不要尝试使用delete
来释放由另一个模块实现的COM服务器(这是您的情况)。
- 你并不总是知道那个服务器是不是用c++写的。在非c++对象上执行
delete
是未定义行为。 - 即使服务器是用c++编写的,你也不知道它被分配到哪个堆上,也不知道
delete
是否会正确释放内存或触发未定义的行为。 - 在没有虚析构函数的接口指针上调用
delete
,这是未定义的行为。 你并不总是知道你被服务的是一个真实的对象还是一个代理。在代理上执行 - 一旦你调用了
Release()
,对象可能已经自我删除了,再次执行delete
是未定义的行为。一些第三方可能已经获得了对象的所有权——例如,一些全局指针实例可能已经被设置为你的对象。如果你设置了delete
,其他指针就会悬空,这可能会导致以后的未定义行为。
delete
是未定义的行为。底线:在这种情况下永远不要使用delete
。调用Release()
来释放对象的所有权,这就足够了。
如果我包含"delete size",是否会因为没有使用New而导致内存泄漏?
通过调用delete
通常不会得到内存泄漏。您可以并且很多时候将获得内存损坏。这两者是非常不同的:内存泄漏意味着你的程序保留了它实际上没有使用的内存,随着时间的推移,如果泄漏的内存继续增长,程序可能会崩溃;内存损坏意味着您以某种方式破坏了内存中的重要簿记结构,并且可能很快就会崩溃(至少您应该希望崩溃,否则情况会更糟)。内存损坏的一个非常常见的原因是使用错误的例程释放内存,特别是在Windows上(在UNIX上重新定义malloc
和free
是一种传统,因此UNIX系统通常会特意确保可以这样做)。
或者在CoCreateInstance
的调用中是否有New
CoCreateInstance
内部的内容应该由Release()
处理。至少,您不应该仅仅因为有一个指针就释放内存。您需要知道内存是如何分配的,以便正确地释放它。
我假设size->Release()正在释放操作系统资源(文件句柄等)。因此,在将size设置为null之前,请将delete size紧接在后面。
- 如何控制或优化或删除或释放 UNION 中未使用的内存
- 文件删除(使用取消链接)与释放所有磁盘空间之间的延迟
- 未找到匹配的运算符删除;如果初始化引发异常,内存将不会被释放
- C++ - 析构函数只是释放内存还是实际删除对象
- 如何通过带有指向基类的指针的删除运算符释放内存
- 为什么在 C++ 执行删除操作后仍可以访问释放的动态分配的内存
- 删除指针时,未分配被释放的 C++ 指针错误
- 删除[]是否可以与通用数组正常使用?如果是这样,为什么使用std :: vector ::擦除它会导致释放内存的错误
- 使用删除与智能指针释放内存以及释放内存的正确方法
- 删除不会在函数结束时释放内存
- 有什么方法可以通过删除表达式安全地处理两次释放内存?
- C++ 删除对象不释放内存
- C++ 在覆盖新运算符和删除运算符时不释放数据
- Windows COM C++ - 使用删除或释放
- C++应用程序:如何正确删除/释放已分配的对象
- 当我通过删除临时节点来释放内存时,我会得到读取访问违规行为.但是只有当我返回错误语句时
- 如何在列表中间释放删除的节点,而没有阀门错误
- 在JNI呼叫中使用后,应删除/释放JarrayObject(字符串阵列)
- 删除/释放性能变化
- 从字符串流中删除(释放)元素