掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
DLL内の関数に渡し、その関数内でnew演算子で領域確保したポインタを開放するには? (ID:66591)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
度々の質問で済みません。 Windows XP SP2 + VS.NET 2003 Ent(SDK)で開発しています。 私がポインタをきちんと理解していないからかもしれませんが・・・ 例えば、Win32アプリ作成のソースの中で以下の関数を用意するものとします。 void test(char **test, UINT *ErrorCode) { if(*test != NULL) { delete[] *test; *test = NULL; } *test = new char[lstrlen("テスト") + 1]; if(*test == NULL) { *ErrorCode = 1; return; } lstrcpy(*test, "テスト"); *ErrorCode = 0; return; } これをWinMain関数等で呼び出した場合、 char *Result = NULL; UINT ErrorCode; test(&Result, &ErrorCode); MessageBox(NULL, Result, "結果", MB_OK); if(Result != NULL) { delete[] Result; Result = NULL; } というように、Resultに関しては、deleteでバッファを開放する必要がありますよね。 これと同じ動きをする(引数も同じ)関数をDLLから HMODULE hMod; char *Result = NULL; UINT ErrorCode; void (*f)(char**, UINT*); hMod = LoadLibrary("GetPCModel.dll"); if(hMod == NULL) { MessageBox(NULL, "DLLロードエラー", "終了", MB_OK); return -1; } f = (void (*)(char**, UINT*))GetProcAddress(hMod, "test"); (*f)(&Result, &ErrorCode); MessageBox(NULL, Result, "結果", MB_OK); if(Result != NULL) { delete[] Result; //<--ここで例外が発生 Result = NULL; } FreeLibrary(hMod); 以上のように呼び出した場合、delete[] の部分 で例外が発生してしまいます。 DLLで呼び出した場合は、バッファの開放の仕方が異なるのでしょうか? それとも、DLLでこの様な事をしてはいけないのでしょうか? DLL作成の経験が殆どないため、不勉強で大変申し訳ありませんが、どなたかご教授 いただけると幸いです。 よろしくおねがいいたします。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.