我在另一个函数中转换的位图结构在函数返回后设置为NULL
功能 :
HRESULT RessourcesLoader::decode(LPCWSTR name,ID2D1Bitmap* bitmap1) {
int hr = S_OK;
hr = LoadFile(name, bitmap1);
assert(SUCCEEDED(hr));
hr = rendertarget->CreateBitmapFromWicBitmap(wicConverter, NULL, &bitmap1);
assert(SUCCEEDED(hr));
return hr;
在这里打电话:
ID2D1Bitmap* bmp1=NULL;
ID2D1Bitmap* bmp2=NULL;
rl->decode(L"Menu_corner.png", bmp1);
rl->decode(L"Menu_side.png", bmp2);
(函数hr是S_OK且结构包含所有内容,一旦函数返回指针为NULL)
这是范围问题吗?
最佳答案
请记住,像ID2D1Bitmap* bitmap1
这样的C ++参数是passed by value。这意味着您有两个完全独立(且几乎不相关)的变量bmp1
和bitmap1
。这两个变量之间唯一的关系是,bitmap1
以与bmp1
调用时的decode
相同的值开始生命-即NULL
。
您的decode
逻辑调用CreateBitmapFromWicBitmap
传递bitmap1
的地址,并且CreateBitmapFromWicBitmap
仔细地用新创建的位图的地址填充bitmap1
。但这根本不影响bmp1
。因此bmp1
仍设置为null。您可以通过在return hr
上放置一个断点,然后查看bmp1
和bitmap1
的内容来自己检查。
如果要让Decode更改bmp1
的内容,则需要将bmp1
的地址传递给decode
,而不是内容。这意味着bitmap1应该为ID2D1Bitmap **
类型,并且解码应这样调用... rl->decode(L"Menu_corner.png", &bmp1);
更新资料
有几条评论指出,我在说“ C ++参数是通过值传递”时相当粗心,我将上面的文字改写为更加集中。
评论还指出,C ++参数既可以通过引用也可以通过值传递。对于decode
函数,请使用语法ID2D1Bitmap*& bitmap1
。
我不得不承认,我对ID2D1Bitmap** bitmap1
和ID2D1Bitmap*& bitmap1
的相对优点有些矛盾。但这可能比我的个人偏见多。
关于c++ - 函数返回后C++ struct被销毁,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58477747/