[C ++结构在函数返回后被销毁

问题描述 投票:0回答:2

我在另一个函数中转换的位图结构在函数返回后设置为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)这是范围问题吗?

c++ visual-c++ direct2d
2个回答
0
投票

[请记住,像ID2D1Bitmap* bitmap1这样的C ++参数是passed by value。这意味着您有两个完全独立(且几乎不相关)的变量bmp1bitmap1。这两个变量之间唯一的关系是bitmap1以与bmp1被调用时的decode相同的值开始生命-即NULL

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

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

更新

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

注释还指出,C ++参数既可以通过引用也可以通过值传递。对于使用语法decodeID2D1Bitmap*& bitmap1功能。

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

您正在将您的位图指针的copy

传递给函数。您的函数会修改副本,但对创建副本的原始指针没有影响。

如果要修改传递给函数的指针,则需要传递引用或指向它们的指针:

HRESULT RessourcesLoader::decode(LPCWSTR name, ID2D1Bitmap*& bitmap1) {
                                                        // ^----- Pass by reference
    int hr = S_OK;
    hr = LoadFile(name, bitmap1);
    assert(SUCCEEDED(hr));

    hr = rendertarget->CreateBitmapFromWicBitmap(wicConverter, NULL, &bitmap1);
    assert(SUCCEEDED(hr));

    return hr;
}

2
投票

您正在将您的位图指针的copy

© www.soinside.com 2019 - 2024. All rights reserved.