スマートポインタとガベージコレクションどちらも
不要になったメモリを自動で削除してくれるものですが、
この二つの大きな違いって何でしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
ガベージコレクション(以下、GC)の定義の仕方にもよるかも知れませんが、不要なメモリ領域を自動的に削除する仕組みのことを示すのであれば、スマートポインタはGCの実装の一つです。
まず、GCの方式を大別すると二つにわかれます。
- 参照カウント
- マーク・アンド・スイープ(以下、M&S)
言語やライブラリによって実装は様々で、参照カウントのみ、M&Sのみ、両方といった分け方から、M&Sをさらに発展させた世代別GCやインクリメントGCを採用しているなど、一概に言えないことに注意してください。
※各言語環境の違いなどは下記の質問でまとめかけていますので、参考にしてください。なお、下記の質問文内では、この回答でのGCの定義と違い、参照カウントのみの場合はGCとしないとしていますので、ご注意ください。
ガーベジコレクション - 言語別GCの仕組み|teratail
スマートポイントは参照カウントの実装の一つです。参照カウントは単純かつ高速という利点がありますが、循環参照が解放されないという欠点を持ちます。そのため、参照カウントのみしかない言語環境では、循環参照にならないように明示的にリソースを解放するというテクニックが必要な場合があります。これは、GCの実装が参考カウントのみである言語環境、例えば、Perl 5、5.3.0より前のPHP、JavaScriptの初期実装などで使われていました。
C++のスマートポインタについても同様に循環参照が解放されないと言うことに注意すべきです。スマートポイントがあるからメモリリークをしない、というのではなく、delete
の書き忘れによるメモリリークが防げる程度と考えた方が良いでしょう。
なお、M&Sがあれば絶対メモリリークをしないというわけではなく、不要にオブジェクトを保持続けてしまうとメモリリークは発生します。GCはメモリ解放のための便利なツールではありますが、万能のAIではないので、その環境での実装の特性を理解・意識した上で、コーディングしていくといいでしょう。
投稿2021/01/17 03:20
総合スコア21737
0
「スマートポインタ」という概念があるのはC++程度ですので、それを前提に回答します。
スマートポインタは、ポインタ自体に解放の仕掛けがしてあるものです。原理的に、スマートポインタと参照先のメモリに触らない箇所では、何の影響も出ません。
これに対して、ガベージコレクタは、環境全体に組み込んであるものです。多くの言語ではスマートポインタ的な実装でも問題ないのですが、C/C++ではメモリを指すポインタが直接見えるのでそうもいきません。
メモリやレジスタの中身を考えつつ、解放できるものは解放するという、C/C++用のガベージコレクタも存在はしますが、必要なメモリがうっかり解放されないように、プログラミング面でも注意が必要となります。
投稿2021/01/16 14:28
総合スコア145975
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
不要になったメモリを自動で削除してくれるものですが、
この言い方を借りるなら、
スマートポインタは、
「不要になった」場合に(処理系の)メモリ管理システムが「自動で削除してくれる」ことになっているメモリを「指し示すもの」(ポインタ)
ガベージコレクションは、
「不要になったメモリを」メモリ管理システムが「自動で削除してくれる」という動作それ自体
別の言い方をするなら、スマートポインタは名詞でガベージコレクションは動詞です。
「ガベージコレクションが起きる」「ガベージコレクションする」とは言いますが
「スマートポインタする」とは言いません。
あと、C++ では言語仕様としてのスマートポインタを持っているので、言語仕様としてのスマートポイインタは、実装技術であるガベージコレクションとは、抽象度のレベルが異なります。
ガベージコレクションがどのような動きなのかはおおよそ決まっていますが、
C++の言語仕様としてのスマートポインタはコンパイラへの指示でしかないので、実際にどのように実装されるかは処理系の実装とコンパイラ(オプティマイザ等)の判断によって異なってくる可能性を持っています。
もちろん、ライブラリなどで別途実装されたスマートポインタはこの限りではありません。
投稿2021/01/16 18:13
編集2021/01/27 12:07総合スコア1193
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/17 04:25
2021/01/17 05:38
2021/01/17 05:49