[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
投票

请记住,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);


0
投票

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

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