我在另一个函数中转换的位图结构在函数返回后设置为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。这意味着您有两个完全独立(且几乎不相关)的变量bmp1bitmap1。这两个变量之间唯一的关系是,bitmap1以与bmp1调用时的decode相同的值开始生命-即NULL

您的decode逻辑调用CreateBitmapFromWicBitmap传递bitmap1的地址,并且CreateBitmapFromWicBitmap仔细地用新创建的位图的地址填充bitmap1。但这根本不影响bmp1。因此bmp1仍设置为null。您可以通过在return hr上放置一个断点,然后查看bmp1bitmap1的内容来自己检查。

如果要让Decode更改bmp1的内容,则需要将bmp1的地址传递给decode,而不是内容。这意味着bitmap1应该为ID2D1Bitmap **类型,并且解码应这样调用... rl->decode(L"Menu_corner.png", &bmp1);

更新资料

有几条评论指出,我在说“ C ++参数是通过值传递”时相当粗心,我将上面的文字改写为更加集中。

评论还指出,C ++参数既可以通过引用也可以通过值传递。对于decode函数,请使用语法ID2D1Bitmap*& bitmap1

我不得不承认,我对ID2D1Bitmap** bitmap1ID2D1Bitmap*& bitmap1的相对优点有些矛盾。但这可能比我的个人偏见多。

关于c++ - 函数返回后C++ struct被销毁,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58477747/

10-12 14:51