🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

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

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

メモリリーク

メモリリークは、プログラムファイルがメモリの解放に失敗した時に起こります。

Q&A

解決済

3回答

3488閲覧

スマートポインタとガベージコレクションの違い

apa

総合スコア68

C

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

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

メモリリーク

メモリリークは、プログラムファイルがメモリの解放に失敗した時に起こります。

1グッド

2クリップ

投稿2021/01/16 13:45

スマートポインタとガベージコレクションどちらも
不要になったメモリを自動で削除してくれるものですが、
この二つの大きな違いって何でしょうか?

Zuishin👍を押しています

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

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

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

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

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

guest

回答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

raccy

総合スコア21737

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

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

apa

2021/01/17 04:25

返信ありがとうございます つまりC C++にはGCがないからよくないと聞きますが GCすべての機能は使えませんが、 GCがない(参照カウントは使えるので)というわけでもないという認識でよろしいでしょうか?
maisumakun

2021/01/17 05:38

> GCがない(参照カウントは使えるので)というわけでもない 確保する時点でスマートポインタを使えば、その機能を利用することはできます。「言語組み込み」としてのガベージコレクションはありません。
apa

2021/01/17 05:49

なるほど C#などですとGCが組み込まれているので 特殊な宣言をしないでも勝手にメモリ管理してくれますね 組み込みじゃないのでGCがないっていうことになっているんですね ありがとうございました!
guest

0

「スマートポインタ」という概念があるのはC++程度ですので、それを前提に回答します。


スマートポインタは、ポインタ自体に解放の仕掛けがしてあるものです。原理的に、スマートポインタと参照先のメモリに触らない箇所では、何の影響も出ません。

これに対して、ガベージコレクタは、環境全体に組み込んであるものです。多くの言語ではスマートポインタ的な実装でも問題ないのですが、C/C++ではメモリを指すポインタが直接見えるのでそうもいきません。

メモリやレジスタの中身を考えつつ、解放できるものは解放するという、C/C++用のガベージコレクタも存在はしますが、必要なメモリがうっかり解放されないように、プログラミング面でも注意が必要となります。

投稿2021/01/16 14:28

maisumakun

総合スコア145975

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

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

maisumakun

2021/01/16 14:31 編集

「ポインタ自体に解放の仕掛けがしてある」と書きましたが、もちろん単なるポインタでは実現できませんので、C++ではポインタをラッピングしたクラスとなっています。
guest

0

不要になったメモリを自動で削除してくれるものですが、

この言い方を借りるなら、

スマートポインタは、
「不要になった」場合に(処理系の)メモリ管理システムが「自動で削除してくれる」ことになっているメモリを「指し示すもの」(ポインタ)

ガベージコレクションは、
「不要になったメモリを」メモリ管理システムが「自動で削除してくれる」という動作それ自体

別の言い方をするなら、スマートポインタは名詞でガベージコレクションは動詞です。
「ガベージコレクションが起きる」「ガベージコレクションする」とは言いますが
「スマートポインタする」とは言いません。

あと、C++ では言語仕様としてのスマートポインタを持っているので、言語仕様としてのスマートポイインタは、実装技術であるガベージコレクションとは、抽象度のレベルが異なります。
ガベージコレクションがどのような動きなのかはおおよそ決まっていますが、
C++の言語仕様としてのスマートポインタはコンパイラへの指示でしかないので、実際にどのように実装されるかは処理系の実装とコンパイラ(オプティマイザ等)の判断によって異なってくる可能性を持っています。
もちろん、ライブラリなどで別途実装されたスマートポインタはこの限りではありません。

投稿2021/01/16 18:13

編集2021/01/27 12:07
kozuchi

総合スコア1193

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

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

maisumakun

2021/01/16 22:55

> スマートポインタは言語仕様、ガベージコレクションは実装技術なので C++ではライブラリレベルでスマートポインタを実装する例があります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問