gpt4 book ai didi

c++ - CComPtr 和引用计数

转载 作者:行者123 更新时间:2023-11-30 00:45:25 25 4
gpt4 key购买 nike

我正在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com