Структура C ++ разрушается после возврата функции - PullRequest
0 голосов
/ 21 октября 2019

Структура растрового изображения, которую я перевожу в другой функции, устанавливается в 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) это проблема области видимости?

Ответы [ 2 ]

2 голосов
/ 21 октября 2019

Вы передаете копию ваших растровых указателей в вашу функцию. Ваша функция изменяет копии, но это не влияет на исходные указатели, из которых были сделаны копии.

Если вы хотите изменить указатели, которые вы передаете своей функции, вам нужно передать либо ссылку, либо указательим:

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;
}
0 голосов
/ 21 октября 2019

Помните, что параметры C ++, такие как ID2D1Bitmap* bitmap1, передаются по значению . Это означает, что у вас есть две совершенно разные (и почти не связанные) переменные bmp1 и bitmap1. Единственное отношение, которое имеют две переменные, состоит в том, что bitmap1 начинает жизнь с того же значения, которое bmp1 имело при вызове decode, то есть NULL.

Ваши decode логические вызовы CreateBitmapFromWicBitmap передавая адреса bitmap1 и CreateBitmapFromWicBitmap, тщательно заполняет bitmap1 адресом вновь созданного растрового изображения. Но , который никак не влияет на bmp1. Таким образом, bmp1 остается равным нулю. Вы можете проверить это самостоятельно, установив точку останова на 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. Но это может сказать больше о моих личных предубеждениях, чем о чем-либо еще.

...