debugとrelease

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Y.T

debugとrelease

#1

投稿記事 by Y.T » 9年前

コード:

//IPアドレスを取得
char* GetMyIPAddress()
{
 // WinSockの初期化
 WSADATA wsaData;
 // エラー処理
 if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) 
  return "error";
 // IPアドレス/ホスト名の取得 
 HOSTENT *lpHost; //ホスト情報の格納
 IN_ADDR addr;  //アドレス格納
 char HostBuffer[256] = "", IPBuffer[16] = ""; //ホスト名,IPアドレス
 printf(IPBuffer);
 //ホスト名取得
 if( gethostname(HostBuffer, (int)sizeof(HostBuffer)) == -1)
  return "error";
 lpHost = gethostbyname(HostBuffer);
 // IPアドレスを取得(メインのv4IPアドレス取得)
 memcpy(&addr, lpHost->h_addr_list[0], 4);
 strcpy(IPBuffer, inet_ntoa(addr));
        ※1
 //winsockの終了
 WSACleanup();
 return IPBuffer;
}
IPアドレスを取得するためのコードを書きました。
上記コードで、debugモードでビルド、実行をすると、うまくIPBufferにIPが入り、取得できるのですが
Releaseモードでビルド、実行すると、IPBufferに入っているはずなのですが、IPを取得できません。
コード中の"※1"のところにprintf(IPBuffer)のコードを1行足すだけで、なぜかIPが取得できます。
いったいどうしてなのでしょう。
IPBuffer[16]を*IPBuffer = new char[16]にしてもうまくいきます。ということは初期化関連で何かおかしいことをしているのかな?と思っていますが、いまいちよくわかりません。
またnew char[16]してしまうとIPBufferを返り値に設定している関係上メモリリークが気持ち悪いので、このあたりどうしたら開放できるかのご教授もいただけるとうれしいです。(別の変数にしてそちらを返り値にする以外の方法でお願いいたします。)

拙い文章で申し訳ありませんがよろしくお願いします。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: debugとrelease

#2

投稿記事 by みけCAT » 9年前

Y.T さんが書きました:上記コードで、debugモードでビルド、実行をすると、うまくIPBufferにIPが入り、取得できるのですが
Releaseモードでビルド、実行すると、IPBufferに入っているはずなのですが、IPを取得できません。
コード中の"※1"のところにprintf(IPBuffer)のコードを1行足すだけで、なぜかIPが取得できます。
いったいどうしてなのでしょう。
自動変数IPBufferの値はそれが宣言されたブロックを抜けたタイミングで消滅します。
debugモードで「うまく取得できる」のはたまたまでしょう。
消滅した変数へのポインタをデリファレンスしてはいけません。
Y.T さんが書きました:IPBuffer[16]を*IPBuffer = new char[16]にしてもうまくいきます。
ブロックを抜けても消滅しないヒープ領域に確保したバッファへのポインタを返したからでしょう。
Y.T さんが書きました:またnew char[16]してしまうとIPBufferを返り値に設定している関係上メモリリークが気持ち悪いので、このあたりどうしたら開放できるかのご教授もいただけるとうれしいです。
データを使い終わったタイミングで

コード:

delete[] (確保した領域の先頭へのポインタ);
という文を実行すれば解放できます。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

閉鎖

“C言語何でも質問掲示板” へ戻る