C++相談室 part150

■ このスレッドは過去ログ倉庫に格納されています
2020/03/24(火) 00:04:33.93ID:YFRNwZnv
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part149
https://mevius.5ch.net/test/read.cgi/tech/1581974381/
このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.105【環境依存OK】
http://mevius.5ch.net/test/read.cgi/tech/1556142878/


■長いソースを貼るときはここへ。■
 http://codepad.org/
 https://ideone.com/

[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)

テンプレここまで
2020/04/24(金) 14:05:22.39ID:A9aEYiqd
c++が悪いんやない!cの型システムが壊れてるからや!
みたいな主張は聞いたことある。
まあしかし互換性がウリですからね。。
2020/04/24(金) 15:11:32.57ID:UPXGgu7R
むしろ、型を壊したのは C++ の方だと思うが。
autoとかで。
2020/04/24(金) 15:14:13.63ID:UPXGgu7R
>>335
C++では、
void *ptr;
CPerson *pPerson;
に対して、
pPerson = ptr;
はエラーになるはず。
だから、C++では
CPerson *pPerson = malloc(sizeof(CPerson));
がエラーになるのだから。
pure Cではならなかったが。

また、
CBase *pBase;
CDerived *pDerived;
に対して、
pDerived = pBase;
もエラーになるはずだ。
2020/04/24(金) 15:15:40.17ID:UPXGgu7R
>>343
何か勘違いしているようだが、人気が有ったのはpure Cの方だからね。
今のC++の人気は、pure Cの人気を引き継いだだけ。
そしてC++が変な拡張を繰り返したからこそ、人気にかげりが見えてきている。
2020/04/24(金) 15:16:31.43ID:om9P6Ux9
>>344
autoは型をきちんと理解して使うもので
アホが使うと謎の動きに翻弄されることになる
2020/04/24(金) 15:19:58.74ID:TokoipqW
>>346
そのコメント343宛でよいの?
349デフォルトの名無しさん
垢版 |
2020/04/24(金) 16:02:04.89ID:3fWjsT92
autoは要らない子
2020/04/24(金) 16:06:41.58ID:h2kPOcUM
auto使ってない人なんて実在するのか?
2020/04/24(金) 16:22:47.89ID:UPXGgu7R
>>341
どう書いてあったか詳しく聞いてみたい。
2020/04/24(金) 17:35:30.22ID:UB0Nvahs
>>345
何で別の話を始めたの?
ちゃんと質問には答えてくれないかな?
2020/04/24(金) 17:42:51.85ID:/uuSllCQ
>>344
型検査の厳しさは型を陽に書くかどうかとは関係ない。

>>345
何をいいたいのかわからん。
2020/04/24(金) 18:14:30.78ID:UPXGgu7R
>>353
馬鹿ですか?
2020/04/24(金) 18:22:23.35ID:JqJmAzM2
>>354
何で>>345で別の話を始めたの?
ちゃんと人の質問には答えようね
2020/04/25(土) 07:51:21.81ID:McBhOj36
>>351
コンパイル時にすべての変数の型が確定しないc++は弱い型付けだから型無し言語に分類だって。
357341
垢版 |
2020/04/25(土) 09:43:58.40ID:qEMV8mRo
>>356
そこは動的型付けの説明だよ。
ちゃんと読んで
2020/04/25(土) 11:27:52.58ID:nL0CusKX
5月号のこと?
359デフォルトの名無しさん
垢版 |
2020/04/25(土) 11:29:47.36ID:4nLfPOGM
トラ枝?
2020/04/25(土) 11:29:54.96ID:nL0CusKX
>>357
その雑誌には、
静的型付け言語であるところの C++ が「型無し言語」であると書いてあるの?
361デフォルトの名無しさん
垢版 |
2020/04/25(土) 19:17:45.69ID:45wIze2e
アムウェイで地味に成功してた僕が業界の裏側を暴露してみた
https://www.youtube.com/watch?v=98udsqJihkA
年間300万円稼げてたのにアムウェイをやめた理由
https://www.youtube.com/watch?v=-H_dBzeJeUM
【体験談】元DDがAmwayで稼ぐのが難しい理由を解説してみた【元ガチ勢】
https://www.youtube.com/watch?v=SpzJEddQOdE
【借金地獄】マルチ商法で死の淵から生還して得たもの失ったもの【ビジネス論】
https://www.youtube.com/watch?v=UxriU-TOrMY
あの頃アムウェイはじめちゃったきっかけ【元ガチ勢】
https://www.youtube.com/watch?v=H9C4n4pL03U
私がネットワークビジネスを勧めない理由とは?
https://www.youtube.com/watch?v=hQNkcfhzv18
2020/04/25(土) 19:26:23.55ID:siKm6MFQ
>>361
グロ
363デフォルトの名無しさん
垢版 |
2020/04/25(土) 19:45:42.98ID:zwQe2okb
auto it = unique(
vecVisibilityPolygonPoints.begin(),
vecVisibilityPolygonPoints.end(),
[&](const tuple<float, float, float> &t1, const tuple<float, float, float> &t2)
{
return fabs(get<1>(t1) - get<1>(t2)) < 0.1f && fabs(get<2>(t1) - get<2>(t2)) < 0.1f;
});

vecVisibilityPolygonPoints.resize(distance(vecVisibilityPolygonPoints.begin(), it));
のresize()から意味がよくわからないのですが、
{0.1, 0.11, 0.2, 0.21, 0.4, 0.41}

{0.1, 0.2, 0.4}
なことでしょうか?
2020/04/25(土) 20:03:25.46ID:NvgVRl2l
>vecVisibilityPolygonPoints
std::vector<T>のハンガリアン記法での接頭辞vecで良いんだっけ…
Tの情報はどう埋め込めば良いんじゃ…
毎回悩むのでJISか何かで決めてホスイ
2020/04/25(土) 20:32:53.50ID:/7S9hKw7
erase使わずにresize使う人始めてみたわ
2020/04/25(土) 22:11:42.84ID:NvgVRl2l
>erase使わずにresize使う人始めてみたわ
ハア?(゚Д゚)ハァ?
2020/04/25(土) 22:34:29.10ID:siKm6MFQ
>>364
vecなんて付けずにvisibilityPolygonPoints でいいんじゃね。システムハンガリアンは不要または有害だと言われるようになって久しいだろう。
処理の都合上、別のコンテナからvectorに詰め替えたとかでvectorであることに強い意味がある状況なら、vecをつけて元の変数と区別する意味はあると思うけど。
2020/04/25(土) 22:56:50.00ID:WEavO2K3
auto使ってハンガリアンとかなんか間違ってるわな。
2020/04/25(土) 23:00:45.13ID:/7S9hKw7
確かにvectorだと処理量変わらんな
2020/04/25(土) 23:11:24.83ID:/7S9hKw7
>>363
3要素のvectorでyzの値が近いものを同一と見なして削除する処理なのかね
unique前のsortどうしてんのか謎だけど

uniqueは重複したものは一つだけ残して前にuniqueなデータを集め、後半にゴミを集める
戻り値はゴミの開始iterator
resize部分はゴミを消す処理
一般的にはerase使ったerase-remove_ifイディオムの変形だな
2020/04/25(土) 23:12:19.03ID:/7S9hKw7
ポリゴンだからソートする必要ないのか
2020/04/26(日) 00:08:03.75ID:PBJtHpgo
使ったこと無いから知らんがstd::unique<T>()は
>削除は、消去される要素が上書きされるように、範囲内の要素をずらすことによって行われます。
とのことなので、callerがstd::unique<T>()を呼ぶ前にソートしておく必要があるのでは…
373デフォルトの名無しさん
垢版 |
2020/04/26(日) 00:15:41.29ID:tEMTnANK
>>370
unique前にソートで昇順にしているみたいです。
2020/04/26(日) 00:30:35.80ID:NFXmWZjN
結局メモリーポインタ関連わかってない奴はガベコレなんかで隠ぺいした言語使っててもバグる
2020/04/26(日) 05:15:56.17ID:mQCdU9mn
vecVisibilityPolygonPoints が「1枚のポリゴンの各頂点の座標(頂点数は任意)」で
座標値は画面に表示すべき値に変換済み(透視投影が完了している)、
<float, float, float> が (x, y, z) を表すと仮定すると…

隣合う頂点のx座標同士、y座標同士がそれぞれ十分に近ければ
その「極端に短い一辺」を1つの頂点とみなして表示処理を軽減、って感じかな。

resize() の結果 size() が 1 か 2 になったらポリゴン全体が
「見えないポリゴン」になるので丸ごと省略、までやるかも。
376375
垢版 |
2020/04/26(日) 05:26:01.50ID:mQCdU9mn
tupple::get<> は 0 始まりだから y, z 座標だね(>>370 さんの言う通り)。
すると少々怪しいか、素朴な仮定だとスッキリ辻褄が合わない。
377デフォルトの名無しさん
垢版 |
2020/04/26(日) 06:57:42.91ID:yiiyQ5aD
申し訳ありません。
>>363のコードは
ttps://github.com/OneLoneCoder/olcPixelGameEngine/blob/master/Videos/OneLoneCoder_PGE_ShadowCasting2D.cpp
の416行からです。
2020/04/26(日) 08:53:55.40ID:PKqlhi9Y
>374
確かにGCあり言語でのリークなんかは逆にデバッグがかなり難しい。
理解してないやつはまず無理。
2020/04/26(日) 10:44:13.53ID:O/ywVmO1
そういうのはシステムのバグで
自分の落ち度じゃねえだろ
2020/04/26(日) 11:12:47.10ID:YMFvD6ns
システムのバグ以外にリークが起きないとでも思ってるの?
2020/04/26(日) 11:14:07.90ID:O/ywVmO1
起きるとでも思っているのか?
2020/04/26(日) 11:15:58.89ID:YMFvD6ns
当たり前
2020/04/26(日) 11:24:00.41ID:O/ywVmO1
えらく無口だな
2020/04/26(日) 11:28:31.53ID:PBJtHpgo
プログラムの開始から終わりまで存在するオブジェクトがリストを所有しており、
そのリストに要素数制限もエラーチェックも無く無制限に増える場合とか、
オブジェクトAとオブジェクトBが互いを参照し合っている場合(循環参照)とか
いろいろ

つかオブジェクトをいつ使い終わったかを機械的に判定する難しさを考えたらワカル
2020/04/26(日) 11:42:05.69ID:BQqaPcbS
使わないのに参照しっぱなしで放置=リークともとれるからね

GCはあるとちょっとは便利でしょって程度のものでヒープ管理の全体像はプログラマが把握しておくべきだと思うわ
頻繁なGCが必要なくらいにヒープ使うのであれば設計から考え直す必要あるんじゃないかと
2020/04/26(日) 11:50:09.63ID:O/ywVmO1
リークじゃねえじゃん
参照元の寿命が尽きてないんなら
2020/04/26(日) 11:54:22.98ID:PBJtHpgo
>>386
参照元の寿命が尽きていなくても使いもしないのであれば現象としてはリ〜クに他ならない
違うというならメモリ消費量が際限なく増え続けるプログラムを客先に納めて
リ〜クではないんですよと仕様ですよ説明して見せると良い
2020/04/26(日) 12:08:46.85ID:O/ywVmO1
>>387
参照元が生きているのをリークとは言わない
その状態で意図しない動作になるのはリーク以外のバグってだけだ
おまえさん自身がそれを仕様ですよと説明できないと言っているように
2020/04/26(日) 12:13:43.92ID:YMFvD6ns
リークですね
2020/04/26(日) 12:15:41.10ID:YMFvD6ns
狭い狭い定義しか知らないと恥ずかしいよ
2020/04/26(日) 12:30:26.50ID:L6Afs0I9
リークの字義的には微妙
プロセス外部から見える挙動はリークと同様だけど
2020/04/26(日) 12:31:51.69ID:O/ywVmO1
>>390
自分が間違って憶えているのを正当化するために定義を広くしようたって誰も協力せんぞ
2020/04/26(日) 12:33:29.76ID:PKqlhi9Y
いや普通に文脈で何を問題にしてるかわかるだろ。。
勝手に自分ルールで解釈狭めてリークはないとか言い出してる奴が頭おかしいわ。
2020/04/26(日) 12:43:33.17ID:oUbeKuvV
明確な定義なんてないだろ
リークに見える挙動はリークだよ
2020/04/26(日) 12:48:55.78ID:Whjp3eXS
リークの定義は複数あっていいと思いますが、「@自分の定義はこれで、だからAこれはリークである/ない」の@A二点を明示するべきだと思いますね
2020/04/26(日) 12:49:09.81ID:O/ywVmO1
>>393
何を問題にしているかと、それをリークと呼ぶか否かは別な話だぜ
2020/04/26(日) 12:49:37.61ID:0EP709eE
リークに見える?
実際リークしてるわけで
2020/04/26(日) 12:50:39.33ID:O/ywVmO1
それこそ「理解してないやつ」がテキトーこいてリークだリークだ言うのと同じだ
2020/04/26(日) 12:51:44.94ID:L6Afs0I9
まあ何から漏れているか明確じゃないのまで、リークと呼び始めた人が悪いんだな
内部的な原因も対処法も全く違うのに、外見だけで同じ名前つけられても混乱するだろうに
2020/04/26(日) 12:52:48.59ID:NFXmWZjN
リークによって起きる現象とリークは分けて考えた方がいい
本質的には未使用メモリーの蓄積だが名称がないから混乱が起きる
蓄積を処理しないのもバグ
リークは蓄積をコントロールできなくなっていて、結果的に処理していない点が違うがこれもバグ
2020/04/26(日) 12:54:00.99ID:wqemtgsF
少なくとも>>384の巨大リストを抱えてる方はリークとは言わない
データ管理がなってないだけ
2020/04/26(日) 12:55:18.24ID:0EP709eE
原因は?
メモリリークによりメモリが不足してました

これだけで終わる会話を
2020/04/26(日) 12:57:19.34ID:0EP709eE
>>401は確かに違う

循環参照は普通検出すると思ってるけど
そうでもないシステムがある?
2020/04/26(日) 12:58:55.24ID:0EP709eE
循環参照で問題になるのはカウント方式の場合
C++のスマポくらいでは?
2020/04/26(日) 12:59:35.20ID:0EP709eE
>>401じゃなくて>>384
2020/04/26(日) 13:01:31.99ID:O/ywVmO1
int main(void)
{
void *p = malloc(1);

int x;
while(scanf("%d", x) != EOF) { //タイプミスで永久ループ
//...
}

free(p); //到達しなくなる
}
参照元pが生きているのはリークではない
2020/04/26(日) 13:18:14.23ID:yChHyLLG
使ってないメモリ領域が増え続けるのはメモリリーク
参照があろうがなかろうが
2020/04/26(日) 13:23:22.33ID:L6Afs0I9
使ってないと言っても使うかもしれないから無限にリストが長くなっているんじゃね

純粋なインメモリデータベースだとそれはリークではないよね
問題が起きたのだとしたら、用途に対してメモリが少なかったのが悪いだけで
2020/04/26(日) 13:23:31.29ID:O/ywVmO1
管理手段が残っているのはリークではない
無駄に多く割り付けたり解放のタイミングがまずいというだけ
2020/04/26(日) 13:30:11.65ID:X/1sAzcb
WikipediaだとGCあってもメモリリークすることになってる
https://ja.wikipedia.org/wiki/%E3%83%A1%E3%83%A2%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%AF#%E3%82%AC%E3%83%99%E3%83%BC%E3%82%B8%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E9%99%90%E7%95%8C
2020/04/26(日) 13:46:44.42ID:Whjp3eXS
>>410
それは GC の種類によるんじゃないでしょうか?
参照カウンタ方式のGC(私は、参照カウンタ方式はGCと呼ばない人ですが)ならGCがあってもリークするでしょうし、
GCの元祖マークアンドスウィープ式や、これも昔からあるコピーGCならば、リークはしないでしょうね
2020/04/26(日) 14:07:55.73ID:YMFvD6ns
どんな方式だってリークする
2020/04/26(日) 14:09:19.26ID:YMFvD6ns
使わないメモリが増え続ければリーク
2020/04/26(日) 14:10:46.96ID:YMFvD6ns
上のリンクのガベージコレクションの限界
に書いてある
2020/04/26(日) 14:18:17.62ID:X/1sAzcb
C#とかだと、イベント購読の解除忘れなどでリークすることがあるそうです。
その対策で弱参照が使われることがあるそうです。
https://ufcpp.net/study/csharp/RmWeakReference.html#weak-event
2020/04/26(日) 14:19:26.91ID:L6Afs0I9
無限に増えるキャッシュ
->使っているからリークじゃない

ログ的なデータを延々と追加するだけ->
リーク
終了時にファイル出力->リークじゃない

つまり、ファイル出力機能を後から追加することでリークじゃなくなるんだな
それでメモリ足りなくなったらなんて呼ぶんだろう
2020/04/26(日) 14:37:42.83ID:r10bSm2e
リークかどうかじゃなくて使ってるか使ってないかだな
プログラマー的には使ってないけどプログラム的には使ってるものをリークと呼ぶのが適切とは思えんけど
418デフォルトの名無しさん
垢版 |
2020/04/26(日) 14:42:49.35ID:fU7fb2M4
プログラマー的には使ってないけどプログラム的には使ってるものをリーク
プログラマー的には使ってるけどプログラム的には使ってないものをリーク
プログラマー的には使ってないけどプログラム的には使っないものをリーク
プログラマー的には使ってるけどプログラム的には使ってるものをリーク
2020/04/26(日) 14:44:35.43ID:1jKTUwjI
どの立場で見るかでしょ
言語のランタイムシステムの立場では参照が残ってるんだったらリークではないといえる
人間の立場では無限にメモリ使ってるつもりがないのにメモリが枯渇するのでリークしてる
現実問題は人間の立場で見るのだから後者でよい
2020/04/26(日) 15:07:57.54ID:O/ywVmO1
枯渇したらリークってのもおかしいぜ
必要容量のRAMを実装していないのがリークになっちまう
2020/04/26(日) 15:17:14.94ID:1jKTUwjI
>>420
典型的にそうやってメモリリークに気づくからそう書いただけ
gc言語でもリークに気を付ける必要があるというのは
20年前ぐらい前から言われている
組み込みJavaが流行った時とか特にね
2020/04/26(日) 15:23:22.13ID:O/ywVmO1
明示的に解放できないシステムでどうやって気をつけるんだよ
さっきからシステムのバグつってんだろ
2020/04/26(日) 15:25:40.91ID:O/ywVmO1
そもそもGCが解放してくれないのはリークではないからだろうが
2020/04/26(日) 15:35:50.39ID:Whjp3eXS
>>412
元祖マークアンドスィープ法やコピーGC ではリークしませんね、これは断言できるでしょう
2020/04/26(日) 15:36:43.62ID:Whjp3eXS
>>414
リンクのwiki には、参照カウンタ方式のリークは書いてあっても、マークアンドスウィープ法やコピーGC についてはリークするとは書いていませんね
2020/04/26(日) 15:38:02.75ID:Whjp3eXS
>>416
あなたはまず、あなたのリークの定義を正確に記述する必要がありますね、現状、あいまいなのでは?>>395
2020/04/26(日) 15:39:27.90ID:Whjp3eXS
>>419
>人間の立場では無限にメモリ使ってるつもりがないのにメモリが枯渇するのでリークしてる
それはメモリ不足であって、リーク(「漏れる」)ではないのでは?
2020/04/26(日) 15:42:28.68ID:X/1sAzcb
>>425
なぜ、リンク先が参照カウンタ方式のことしか述べていないと思ったのですか。
参照カウントではないC#でも弱い参照が存在することは
>>415のリンクで説明したはずですが。
2020/04/26(日) 15:47:18.06ID:Whjp3eXS
>>428
>参照カウントではないC#でも弱い参照が存在することは

@強い参照、弱い参照を使い分ける方式は、参照カウント法の一種だと認識しています
A元祖マークアンドスウィープ法、コピーGC法では原理的にリークは発生しませんし、発生し得ません
2020/04/26(日) 15:55:37.10ID:O/ywVmO1
>>410
おまえさんWikipediaってどんな所だか知ってるか?

ちなみに俺もとあるページを執筆したことがあるが
俺はどこの馬の骨か聞かれもしなかったし
アホなミスをしでかしてもあんまり指摘されないし
悪意のある文面をやめさせるのにも手間取るぞ

査読できる人でないと鵜呑みは危険だぞ
2020/04/26(日) 15:57:08.52ID:X/1sAzcb
一方、マーク・アンド・スイープ方式やコピーGC方式では循環参照によるメモリリークは
発生しないが、非意図的オブジェクト保持(unintentional object retention)が引き起こす
メモリリークを強参照のみによる実装で解消することは難しく煩雑であり、
実装を簡略化するために弱参照が用いられることがある。

https://ja.wikipedia.org/wiki/%E5%BC%B1%E3%81%84%E5%8F%82%E7%85%A7
2020/04/26(日) 16:08:55.70ID:Whjp3eXS
>>431
>>429
@強い参照、弱い参照を使い分ける方式は、参照カウント法の一種だと認識しています
2020/04/26(日) 16:10:32.96ID:X/1sAzcb
使ってる言葉の意味が異なる人を説得するのは無理だと悟った
2020/04/26(日) 16:21:48.25ID:YMFvD6ns
また面倒なのが出てきたな
wikipediaのリンクで終わったかと思ったのに
QZは頭が弱いから
2020/04/26(日) 16:22:02.20ID:CnmrePPR
>>426
407の定義だと曖昧すぎて気持ち悪くなるって例出しただけ

確保したメモリを使用しなくなったのに解放しないまま管理外にするのが狭義のメモリリーク
それ以外の現象もメモリリークと呼ぶのは知っているが、その呼び方は混乱招くから好きじゃないって立場
2020/04/26(日) 16:26:58.57ID:YMFvD6ns
使わない、使うつもりもない、プログラマが意図しないメモリ
これらが増え続ければリーク

定義じゃなくて十分条件の例
2020/04/26(日) 16:28:11.48ID:1jKTUwjI
>>422
> 明示的に解放できないシステムでどうやって気をつけるんだよ

gc言語で本格的な開発したことないって白状してるようなもんだね
メモリプロファイラで地道に調べるんだよ
あと不要になったらgc任せにせずに即null代入しておけとかよく言われるだろ

> さっきからシステムのバグつってんだろ

システムって何だよ?意味広すぎるから説明になってない
gc言語においては言語レベルではリークしない(循環参照はさておき)
が依然人間の不注意によって実質的なリークは起るわけ
それをお前はリークと呼ばなんだろうけど一般的にそれもリークと呼ばれてる
それだけの話
理解しようぜ
2020/04/26(日) 16:28:26.47ID:YMFvD6ns
管理外っていうのは何を示してるかよく分からない
439デフォルトの名無しさん
垢版 |
2020/04/26(日) 16:29:38.80ID:fU7fb2M4
>>430
wikipediaは
歴史系は特に悪意のある文面多いですね
特に日本史
2020/04/26(日) 16:43:46.17ID:1jKTUwjI
>>423
昔から言われてることだけに昔の記事あったからこれでも読んでみ
ttps://www.atmarkit.co.jp/fjava/rensai3/debug02/debug02_1.html

単に何をリークと呼ぶかというだけの話
Javaの開発元のサンの人もこういうんだからそれにあわせようぜ
2020/04/26(日) 16:45:39.03ID:PBJtHpgo
>>438
GCが解放してくれるとプログラマが信じているが事実はそうでないケース
2020/04/26(日) 16:49:23.41ID:PBJtHpgo
プログラマーが自分で作ったつもりのスレッドで資源を確保して、
スレッドの最初の関数からreturnしたら全部解放されると思いきや!
実はスレッドプールの1要素としてシステムが握りっぱなしだった、
みたいなテクノロジーホラーが
あるのかも
しれませんね
知らんけど
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況