質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

6回答

765閲覧

C++クラスのデストラクタは重要ではない?

kotoraemon

総合スコア21

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/11/29 09:46

C++のクラスにおいて、理論上、デストラクタは重要だが、実用上は必ずしも重要でないというような話を聞きました。

理論的には、一度割り当てたメモリを、不必要になった際に解放し、メモリリークを防ぐものとして重要、と認識しています。「実用上は必ずしも重要でない」とは、どのようなことを言っているのでしょうか?

どなたかご教示いただけますと幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dameo

2019/11/29 10:13

文脈によるので、何とも言えませんし、そういうのはご本人に聞いて頂いた方がいいです。 あえて想像で考えるなら、仮にメモリリークしてたとしても、プロセス終了時には開放されるわけで、クライアント側のライフサイクルが短くてリソース消費量の少ないプロセスなら、それほどクリティカルではないと思います。もちろん良い悪いで言えばダメなのですが、状況次第ではドキュメントだけ残してすぐには直さないという選択肢もありえます。
kotoraemon

2019/11/29 23:07

確かに文脈によりますね。 「仮にメモリリークしてたとしても、プロセス終了時には開放されるわけで、クライアント側のライフサイクルが短くてリソース消費量の少ないプロセスなら、それほどクリティカルではない」「もちろん良い悪いで言えばダメ」、非常に勉強になりました。
guest

回答6

0

「実用上は必ずしも重要でない」

そんなことは全く無いです。

ただし自分で定義も宣言も書くべきではないと言えるでしょうが。(RAIIなクラスを作るときや継承が絡むときを除く)

デストラクタの宣言を書くとmove ctorが自動生成されなかったり、いろいろだるいので、デストラクタを書くとなったら全部のコンストラクタを自力で書くことになりますね。

投稿2019/11/29 09:49

編集2019/11/30 03:01
yumetodo

総合スコア5850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

asm

2019/11/29 13:13

P0052r10が実装されたらなぁ・・・と思わずにはいられないですね。
kotoraemon

2019/11/29 23:04

なるほど、理論上も実用上も重要だが、ただし自分で定義も宣言も書くという必要はないといえるのですね。まだまだ勉強不足なので非常にためになりました。ありがとうございました。
guest

0

こんにちは。

デストラクタ、実用上非常に便利ですよ。C#等の他のメジャーな言語にはないので、それらの言語を使う時は無駄に苦労します。(C#のusingとDestroyとか面倒で面倒で)

獲得したら開放しないと行けないものはメモリ以外にも本当に多数あります。
ファイルはオープンしたらクローズしないと行けないですし、獲得したMutexは確実に開放する必要があります。
それらを RAIIパターンにて、コンストラクタでオープンしてデストラクタでクローズするって超便利です。リソース・リークの可能性を大きく低減できますから。

デストラクタで発生したエラーを通知できない(=事実上デストラクタでエラーを発生させてはいけない)という欠点があるので悩ましい部分はありますが、その欠点を乗り越える苦労をしてでも使う価値があると私は思います。

投稿2019/11/29 10:03

編集2019/11/29 10:05
Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kotoraemon

2019/11/29 23:04

理論上だけでなく、実用上も非常に便利なのですね。基礎の部分もまだまだ勉強不足なので、非常にためになりました。これからよく勉強していきたいと思います。ありがとうございました。
guest

0

ベストアンサー

現代の一般的なOSはプロセス終了時に開きっぱなしのメモリやファイル等はOSが片付けます。
つまり、起動してすぐ終了する程度の規模であれば気にしなくても問題にならないということです。

もちろん、起動しっぱなしで大きなメモリを何個も確保し解放する必要がある場合や
なんらかのバグで終了できなくなる場合や特殊なOSに移植する場合などに困るので
しっかりとデストラクタで解放したほうがよいです。

投稿2019/11/29 10:17

asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yumetodo

2019/11/29 12:20

まあそういうときはstd::quick_exitを使うことを考えるべきかもしれない。
kotoraemon

2019/11/29 23:04

回答ありがとうございます。 デストラクタで解放したほうがよい、ということを前提として、「起動してすぐ終了する程度の規模」であれば、気にしなくても問題を引き起こさないということですね。勉強になりました。 std::quick_exitについても勉強したいと思います。ありがとうございました。
guest

0

クラスの中で何もメモリを確保しないのであれば良いですが、クラスの中で大きなメモリを動的に取る場合は必要です。デストラクタで開放しないクラスを、ループの中で沢山使用するとメモリが枯渇して落ちてしまいます。

投稿2019/11/29 09:53

編集2019/11/29 09:53
mattn

総合スコア5030

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kotoraemon

2019/11/29 23:04

>クラスの中で大きなメモリを動的に取る場合は必要です。デストラクタで開放しないクラスを、ループの中で沢山使用するとメモリが枯渇して落ちてしまいます。 重要な点ですね。勉強になります。ありがとうございました。
guest

0

メモリのことだけ心配するならそうかも知れませんが、
組み込み屋的には、デバイスを抽象化したクラスではデバイスの後始末が必要なことも多いのでおろそかに出来ません。そんなのOSが面倒みてくれるわけもなく。

投稿2019/11/30 00:43

thkana

総合スコア7639

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

使い方次第としか言えません。

強いて意図を探るとすれば、**「割り当てるメモリのライフサイクルがプロセスのライフサイクルとほぼ同一」**ならばほぼ不要です。プロセス終了時にOSがまとめてお片付けしてくれるからです。

ただし、**デストラクタでファイル書き込みする場合などは話が別です。**これをスキップすると動作が変わってしまいます。

投稿2019/11/29 14:26

HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kotoraemon

2019/11/29 23:05

「割り当てるメモリのライフサイクルがプロセスのライフサイクルとほぼ同一」ならば不要、「プロセス終了時にOSがまとめてお片付けしてくれる」、なるほど、明解な回答ありがとうございます。勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問