[過去ログ] 【初心者歓迎】C/C++室 Ver.101【環境依存OK】 [無断転載禁止]©2ch.net (1002レス)
上下前次1-新
抽出解除 レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
リロード規制です。10分ほどで解除するので、他のブラウザへ避難してください。
780(2): デフォルトの名無しさん [sage] 2017/10/01(日) 08:09:58.98 ID:a+6SxdIf(1/2) AAS
明示的に解放しないstringの方はそこを意識してなかった可能性もあるんじゃね?
非同期ってことは>>765765(6): デフォルトの名無しさん [sage] 2017/09/30(土) 01:55:47.47 ID:+yH9ha/d(1/2) AAS
ちょっと不可解な部分があったから質問させてくれ
string型のデータをサーバに送信したくてOSSの関数に渡しているんだが、
データが一部壊れてしまう
問題のコードは、
string str = "{id:abc, ... , }"
void* payload = (void*) str.c_str();
send(payload, str.length());
これをやると、先頭の5バイトがうまく入らない
いくら考えても全然理由がわからず、意味のないことだと思いつつも以下のコードを書いてみたら何故かうまくいった
string str = "{id:abc, ... , }"
char* tmp = (char*)malloc(str.length() * sizeof(char) + 1);
strcpy(tmp, str.c_str());
payload = (void*)tmp;
send(payload, str.length());
下のコードを使えばうまく動いてるから問題ないんだけど、上のコードがダメな理由がわからずすごく気持ち悪い。
何か上の例だとまずい部分があるのかな?
送信関数は以下
send(void* payload, size_t length);
環境はVC++ 2012
Windows 7 64bit
ちなみに、同じコードを別環境(gcc 4.4.7 Cent OS 32bit)で動かすと、両方うまくいった
でsendした関数からは一旦抜けてるでしょ?
782: デフォルトの名無しさん [sage] 2017/10/01(日) 09:35:07.78 ID:JA+cHEn5(1) AAS
>string str = "{id:abc, ... , }"
>void* payload = (void*) str.c_str();
>>780はpayloadを明示的に解放すんのかよ
784(1): デフォルトの名無しさん [sage] 2017/10/01(日) 10:26:50.12 ID:7TdPvZgo(1) AAS
>>780
>>771771(3): 765 [sage] 2017/09/30(土) 10:38:13.12 ID:+yH9ha/d(2/2) AAS
みんな回答ありがとう。
>>766
string型のメソッドで、文字列をconst char*にするやつ
>>767,769
非同期送信にはなってるんだけど、sendの後に送信結果を受け取る関数を呼んでる。
そのあとでpayloadは解放されるようになってるから、送信完了までは実体は生きてると思う
>>770
OSSの関数がそう定義されてるから変換したんだ
{id:abc. ... , }
のうち先頭5文字の{id:aがおかしくなってるんだよね・・
Wiresharkでみると、バイトコード88ってなってたけどなんでそうなったのかが全然わかんない
に
>> 非同期送信にはなってるんだけど、sendの後に送信結果を受け取る関数を呼んでる。
>> そのあとでpayloadは解放されるようになってるから、送信完了までは実体は生きてると思う
ってあるからその可能性は低いと思う
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.045s