[過去ログ] C++相談室 part164 (1002レス)
上下前次1-新
抽出解除 必死チェッカー(本家) (べ) レス栞 あぼーん
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
497(2): (ワッチョイ 0928-rP6O) 2023/07/17(月)18:33 ID:mG7BHGLy0(1/5) AAS
質問なのですがclass Datasというクラスがあってstd:::vector<Datas> vec((size_t)100); であるときに
vec[k]の場所にn個の場所を空けたい(値は初期化済Datasオブジェクトなら何でも良い)場合どう書くべき?
やっぱ手動でsz = vec.size(); vec.resize(sz + n);して既存要素vec[k..sz-1]を後ろ(vec[k+n..])にコピーする --- (1)
のが最速?
仮にstd::vector<T>::insertを使うと
Datas x; // (A)
vec.insert(std::next(vec.begin(), k), n, x); // (B)
になると思うのですが、なんか(A)で不必要にオブジェクトを1個構築せねばならないのと
(B)で多分デフォルトコンストラクタではなくコピコンがn回呼ばれるのちょっち嫌
(なぜなら(1)のコピーとn個分の場所の確保に加えて、xをn回コピーするという余デフォルト構築よりも遅そうな処理をするから
504: (ワッチョイ 0928-rP6O) 2023/07/17(月)23:34 ID:mG7BHGLy0(2/5) AAS
わかりました
506(2): (ワッチョイ 0928-rP6O) 2023/07/17(月)23:46 ID:mG7BHGLy0(3/5) AAS
>>502
>GetObjが内部でnewされていると、この作りではいつかメモリ不足になってしまいます。
この懸念は普通の作りなら基本的に無用。基本的に問題無い
(1) Obj1という型がポインタやハンドルではなくクラスの場合:
objはwhile(1) { }のブロックの中で構築されるので
ループの終わりでデストラクタが呼ばれる(破棄される)から、
Device::GetObj()が真っ当な作りならnewしたポインタをObj1のインスタンスobjに引き渡し、
Obj1クラスが真っ当な作りならobjが破棄されるときに引き渡されたポインタをdeleteする(ように作る
からダングリングポインタは生じない(ようにできる
(2) Obj1という型がポインタやハンドルの場合
省2
507: (ワッチョイ 0928-rP6O) 2023/07/17(月)23:47 ID:mG7BHGLy0(4/5) AAS
基本的に、というのは(2)のケースで例外が生じたときクローズされずに抜けてしまう危険性があるのと、
(1)のケースにおいてもobj1の構築中に例外が生じた場合はきちんとデストラクトされない危険性がある。
Obj1のメンバがnewされるべき生ポインタの場合はこれは対処不能。生ポはやめてスマポにすればおk
詳しい話ははちみつ餃子氏に聞くと良い(マテ
508: (ワッチョイ 0928-rP6O) 2023/07/17(月)23:58 ID:mG7BHGLy0(5/5) AAS
訂正orz、
誤: ループの終わりでデストラクタが呼ばれる(破棄される)から、(>>506
正: ループが次の繰り返しに入る前かループを抜ける際にデストラクタが呼ばれる(破棄される)から
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 1.496s*