[過去ログ] C++相談室 part164 (1002レス)
上下前次1-新
抽出解除 レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
502(3): デフォルトの名無しさん (ワッチョイ ae7a-CYkg) [sage] 2023/07/17(月) 23:18:54.88 ID:vGotTgNV0(1) AAS
リアルタイムOSのタスクのように無限ループが前提のとき
TASK Task1() {
while(1) {
Obj1 obj = Device::GetObj();
:
:
}
のようにobjを使う場合に、GetObjが内部でnewされていると、この作りではいつかメモリ不足になってしまいます。
そうなると自作でないクラスのメソッドは使う前にnewの有無をすべて調べなければならなくなるように思います。
実際はそんな不条理はないはずで、このような問題はどう対処するのがいいですか。
503: デフォルトの名無しさん (ワッチョイ df01-L4gQ) [sage] 2023/07/17(月) 23:25:49.78 ID:CT+u9aWW0(1) AAS
>>502
自作でないクラスのメソッドは使う前には
メソッドが消費するメモリを見積もらなければなりません
不条理でも何でも無い
506(2): デフォルトの名無しさん (ワッチョイ 0928-rP6O) [sage] 2023/07/17(月) 23:46:35.71 ID:mG7BHGLy0(3/5) AAS
>>502
>GetObjが内部でnewされていると、この作りではいつかメモリ不足になってしまいます。
この懸念は普通の作りなら基本的に無用。基本的に問題無い
(1) Obj1という型がポインタやハンドルではなくクラスの場合:
objはwhile(1) { }のブロックの中で構築されるので
ループの終わりでデストラクタが呼ばれる(破棄される)から、
Device::GetObj()が真っ当な作りならnewしたポインタをObj1のインスタンスobjに引き渡し、
Obj1クラスが真っ当な作りならobjが破棄されるときに引き渡されたポインタをdeleteする(ように作る
からダングリングポインタは生じない(ようにできる
(2) Obj1という型がポインタやハンドルの場合
確保したポインタやハンドルはいずれクローズせねばならない。
ループが次の繰り返しに入る前に確実にクローズすればよい
509: デフォルトの名無しさん (ワッチョイ 847c-8c0A) [sage] 2023/07/18(火) 00:04:09.43 ID:yoLqrsJ/0(1) AAS
>>502
必要ならそのGetObj()とやらのドキュメントにDevice::ReleaseXyz()とかDevice::ReleaseObj(obj1)とかobj1.release()とかを後で呼ぶように指示されてるはず
それを怠ってリークさせたならお前がタコ
そういう指示がないくせに勝手にリークするならそのライブラリがタコ
そんだけの話
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.040s