- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 CComPtr 类型的对象.但是我有一些内存泄漏问题。特别是,我有以下代码:
CComPtr<ID2D1Bitmap> bitmap = create_bitmap(bitmapSize);
auto n = count_ref((ID2D1Bitmap*)bitmap);
地点:
template<class Interface>
ULONG count_ref(Interface* pInterface) noexcept
{
if (pInterface)
{
pInterface->AddRef();
return pInterface->Release();
}
return 0;
}
并且:
ID2D1Bitmap* create_bitmap(const D2D1_SIZE_U& size)
{
ID2D1Bitmap* bitmap;
CreateBitmap(&bitmap);
return bitmap;
}
我期望 n
的值等于 1,但它实际上等于 2。为什么我的 CComPtr
的引用计数不是 1?
我是否正确使用了我的 CComPtr
对象?
当进程终止时,我得到以下内存泄漏:
An interface [072B1F50] was created but not released. Use 'dps 072B1F20' to view its allocation stack.
Object type: ID2D1Bitmap
Device-dependent size: 1000 x 600
Device-independent size: 1000.00 x 600.00
Format: DXGI_FORMAT_B8G8R8A8_UNORM
Alpha mode: D2D1_ALPHA_MODE_PREMULTIPLIED
Outstanding reference count: 1
D2D DEBUG ERROR - Memory leaks detected.
最佳答案
有了 CComPtr
,您很少需要使用原始接口(interface)指针类型。
你可以这样做,例如:
CComPtr<ID2D1Bitmap> create_bitmap(const D2D1_SIZE_U& size)
{
CComPtr<ID2D1Bitmap> bitmap;
CreateBitmap(&bitmap); // Declared as CreateBitmap(ID2D1Bitmap**);
return bitmap;
}
CComPtr<ID2D1Bitmap> pBitmap = create_bitmap(...);
...
CComPtr 类将在您传递指针的过程中准确地管理引用:局部变量、返回值、新局部值。在 Release 构建中优化编译器也会删除一些过多的 AddRef/Releases,因此您不必太担心它们。
关于c++ - CComPtr 和引用计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43411838/
我正在将 VS2008(VC++) 代码迁移到 VS2013。我收到以下错误: error C2664: 'HRESULT _CopyItfFromAdaptItf::copy(T **,ATL::C
我有一个成员变量声明为 CComPtr m_spXMLDoc; XML 文档是这样创建的 CoCreateInstance(CLSID_DOMDocument, NULL, CLSCTX_INPROC
我正在使用 CComPtr 类型的对象.但是我有一些内存泄漏问题。特别是,我有以下代码: CComPtr bitmap = create_bitmap(bitmapSize); auto n = co
我有一种情况需要传递 CComPtr通过引用到一个函数。被调用参数是否从被调用参数中获取所有权(或)引用计数增加? void foo( CComPtr & pReader ) { // There
我使用 crtdbg 检测泄漏位置,在调用 new 时出现内存泄漏 CComPtr m_spColumnInfo CComPtr spResult = new CDBColumnInfo(); //M
我是 COM 和智能指针的新手,我正在尝试将项目从原始指针转换为 CComPtr 以避免内存管理的麻烦。我正在寻找一些关于如何在一般情况下正确使用 CComPointers 的功能和范围的建议。我的代
我不确定这种在函数内部使用 CComPtr 的方式,该函数的参数表示为双指针: HRESULT D3DPresentEngine::CreateD3DSample( IDirect3DSwap
我在我的类中定义了以下 CComPtr 对象和方法: private: CComPtr& getRawPdu(); // Returns the RawPdu interface po
这里有个简单的问题 假设我们有一个使用 shared_ptr/enable_shared_from_this 的代码库。 我们被要求将代码库的一部分转换为 COM 服务器,我们应该在其中使用 CCom
我正在使用 CComPtr 保存指向 com 对象的指针。 我还用类包装了资源: class ResourceWrapper { public: ResourceWrapper() {
当 CComPtr 作为类的成员变量时,如何销毁它? 下面是我写的一段代码,m_piControl是成员变量CComPtr。我已将 m_piControl 的值分配给 rpControl 和 rpCo
我有点习惯通过 COM 进行引用计数的概念,但我对 shared_ptr 有点陌生。我在 shared_ptr 中没有找到 CComPtr 的几个不错的属性,我想知道防止误用 shared_ptr 的
我正在做一些 COM 编程,我的编译器是 gcc。这意味着 CComPtr 对我不可用。如何使用 Boost 轻松实现替换?我需要的语义是: 复制时调用AddRef 销毁时调用Release 额外:能
在应用程序中使用静态 CComPtr 成员变量不是个好主意吗?由于我们无法控制静态变量的销毁,它可能发生在 CoUninitialze 之后。 最佳答案 如果您采取适当的预防措施,那么使用 CComP
我觉得..Attach 和 Detach 不会改变引用计数。但是 CComPtr 的析构函数在它包含的指针上调用释放。 那么有没有必要在一个use attach的时候每次都调用detach呢?...
我正在编写一个 C++/CLI 类,需要在其生命周期内保持 CComPtr,例如 public ref class MyClass { public: MyClass() {
我只想知道 ComPtr 之间的确切区别和 CComPtr ,以及是否 ComPtr::As()是 CComPtr::QueryInterface() 的类似物? 我阅读了两者的文档,但这个问题没有明
当用户按下登录按钮时调用 StartComObjects 函数,当用户按下取消按钮时调用 StopComObjects 函数。 StartComObjects 函数使用 CComPtr.CoCreat
我在尝试将基于 directshow 的直播播放器编写为 ActiveX 控件时遇到了问题。 我先用VS2010创建了一个MFC ActiveX控件工程(VC++类下),并在控件上附加了一个对话框,然
我对 COM 智能指针类 CComPtr 的使用有疑问。我正在关注 documentation 中的示例并且代码似乎没有在 CComPtr 上调用 CoCreateInstance()(它只是在为其赋
我是一名优秀的程序员,十分优秀!