[過去ログ] 【初心者歓迎】C/C++室 Ver.101【環境依存OK】 [無断転載禁止]©2ch.net (1002レス)
上下前次1-新
抽出解除 レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
765(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)で動かすと、両方うまくいった
766(1): デフォルトの名無しさん [sage] 2017/09/30(土) 02:12:16.55 ID:/jgYbdHq(1) AAS
>>765
c_str()ってどんな関数?
771(3): 765 [sage] 2017/09/30(土) 10:38:13.12 ID:+yH9ha/d(2/2) AAS
みんな回答ありがとう。
>>766
string型のメソッドで、文字列をconst char*にするやつ
>>767,769767(1): デフォルトの名無しさん [sage] 2017/09/30(土) 02:45:21.56 ID:mQbjCOfm(1) AAS
非同期やbufferedの関数を正しく使えてないんだろ
たしか以前にboost.asioかなんかの同じような質問をきいたことがあったような
769(1): デフォルトの名無しさん [sage] 2017/09/30(土) 07:12:02.93 ID:7qICbiUO(1) AAS
そのインターフェースで非同期なのに 内部で実体のコピーをとってない場合とかだと
実際に送信完了するまで 渡した引数の実体が生きてる必要があるね
非同期送信にはなってるんだけど、sendの後に送信結果を受け取る関数を呼んでる。
そのあとでpayloadは解放されるようになってるから、送信完了までは実体は生きてると思う
>>770OSSの関数がそう定義されてるから変換したんだ
{id:abc. ... , }
のうち先頭5文字の{id:aがおかしくなってるんだよね・・
Wiresharkでみると、バイトコード88ってなってたけどなんでそうなったのかが全然わかんない
777: デフォルトの名無しさん [sage] 2017/09/30(土) 23:53:50.61 ID:xUuIbR05(1) AAS
>>771
> そのあとでpayloadは解放されるようになってるから、送信完了までは実体は生きてると思う
str.c_str() 渡した場合は str の寿命や変更で解放されることになる。
他のどこかで解放されるようになってるとしたら、そんなところに渡してはいけないと思う。
どこかで free されることになってるなら、 malloc したポインタを渡さないと
正しく動かないということで >>765 の結果で当然に思う。
「OSSの関数」というなら具体的な関数を明示すればもっと状況がわかるのに。
780(2): デフォルトの名無しさん [sage] 2017/10/01(日) 08:09:58.98 ID:a+6SxdIf(1/2) AAS
明示的に解放しないstringの方はそこを意識してなかった可能性もあるんじゃね?
非同期ってことは>>765でsendした関数からは一旦抜けてるでしょ?
794(1): デフォルトの名無しさん [sage] 2017/10/04(水) 15:03:07.29 ID:B6Js2yoS(1) AAS
>>788いちいち古いVC入れ直すのめんどいから覚えてるんなら書いてほしいんだが
あと>>765が解決したのかどうかも知りたい
799: デフォルトの名無しさん [sage] 2017/10/05(木) 21:31:37.51 ID:Px1fI0/v(1) AAS
いちいちけなさんと会話も出来んのかゴミクズが
へー、じゃあ寿命は保証されてるわけか、そんなことはなかったはずだが
>>765の問題は寿命の問題だと思うが、ケチつけるなら正確に書いてくれる?
混乱を招くだけのイチャモンとか何の役にも立たんわ
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.039s