ページ 11

WinMain()…なぜかヒープ破壊(Web APIに接続)

Posted: 2010年11月30日(火) 18:10
by Hina
お久しぶりです
覚えている人はいないと思いますがHina(Yuno)です

今回、C++でWeb APIに頼るソフトを設計しようと思ったのですが
のっけからつまずいてしまいました

Web の接続は何とかなっていますが、Xml実装について質問しようかと思った矢先
以下のコードでヒープ破壊が起きてしまいました
見たところ二重開放などは行っていません
しかも、ヒープ破壊が起きるのはWinMainから返ってきたあたりです

ますますわけがわかりません

どなたか教えてください

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化

::CoInitialize(NULL);
WinHttp::IWinHttpRequestPtr Request;
Request.CreateInstance(WinHttp::CLSID_WinHttpRequest);
Request->Open(L"GET", L"http://jlp.yahooapis.jp/MAService/V1/pa ... は二羽ニワトリがいる。");
Request->Send();
std::cout << Request->ResponseText;
_bstr_t t = Request->ResponseText;
char *t01 =(char *)malloc(sizeof(char));
strcpy(t01,(char *)t);
::CoUninitialize();
while(ProcessLoop()==0){//メインループ
DrawXmlStringEx(0,0,t01,GetColor(255,255,255));
ScreenFlip();//裏画面反映
}
DxLib_End();//DXライブラリ終了処理
return 0;
};

開発環境は
Win XP Home Sp3
Visual Studio 2005 C++
です
よろしくお願いします

Re: WinMain()…なぜかヒープ破壊(Web APIに接続)

Posted: 2010年11月30日(火) 18:28
by 結城
新しいとこには始めてきたのでユーザー登録してませんでした
後コードをタグでくくるの知らなかったです
すみません

Re: WinMain()…なぜかヒープ破壊(Web APIに接続)

Posted: 2010年11月30日(火) 19:00
by softya(ソフト屋)
最低限、動くコード全体を提示してもらったほうが答えやすいですが、
char *t01 =(char *)malloc(sizeof(char));
で1バイトしかメモリ確保してませんので、strcpy出来ると思えません。
ここがメモリ破壊の原因だと思います。

Re: WinMain()…なぜかヒープ破壊(Web APIに接続)

Posted: 2010年11月30日(火) 19:19
by 結城
ありがとうございます
だとすると
char *t01 =(char *)malloc(sizeof(char));

char *t01 =(char *)malloc(sizeof(char*));
でいいのでしょうか?
しかしこの場合でもまだヒープ破壊は起きます

すいません、コードをあげておきます

Re: WinMain()…なぜかヒープ破壊(Web APIに接続)

Posted: 2010年11月30日(火) 19:35
by softya(ソフト屋)
WinHttpRequestを使ったことがないので、ちゃんとした方法がわかりませんが、
char *t01 =(char *)malloc(sizeof(char)*(strlen((char*)t)+1));
で大丈夫だと思います。

つまり、strcpyするなら文字列サイズ分のバッファを確保してやらないと駄目っだって事なんですが。
文字列は、'\0'も含めてバッファが必要ですので文字列長に+1したサイズを確保してください。

Re: WinMain()…なぜかヒープ破壊(Web APIに接続)

Posted: 2010年11月30日(火) 20:19
by 結城
解決できました!!
バッファの長さを取得していないことが原因だったのですね
softya(ソフト屋) さんありがとうございます!