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

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

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

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

Q&A

解決済

1回答

712閲覧

std::unique_ptrとstd::shared_ptrの使い方

退会済みユーザー

退会済みユーザー

総合スコア0

C++

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

0グッド

0クリップ

投稿2022/09/24 05:51

編集2022/09/24 06:02

std::unique_ptrとstd::shared_ptrの学習中です。
関連する質問が3つあります。

質問①

std::make_sharedや、std::make_uniqueを使わなくても以下のような他のアドレスで初期化する感じでもOKなのでしょうか?

C++

1 int index = 10; 2 std::unique_ptr<int> A(&index);

質問②

①がOKだとしたら、std::make_uniqueを使用する意味は何ですか?

質問③

std::unique_ptrは所有権を1つに限定するポインタ。
td::shared_ptrは所有権が複数で共有可能でどこからも参照されなくなったら開放される変数。
という理解なのですが、以下の例では、Aをstd::shared_ptrであるBにセットした場合、Aが所有していたアドレスはstd::shared_ptrになるということだと思いますが、この時、共有されるようになるため、std::unique_ptrにした意味がなくなっているという理解でいいでしょうか?

C++

1 int index = 10; 2 3 // ① unique_ptrの作成 4 std::unique_ptr<int> A(&index); 5 6 // ② shared_ptrの作成して②の所有権を移動 7 std::shared_ptr<int> B(std::move(A));

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

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

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

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

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

guest

回答1

0

ベストアンサー

std::unique_ptrは所有権を1つに限定するポインタ。
td::shared_ptrは所有権が複数で共有可能でどこからも参照されなくなったら開放される変数。

と書かれていますが,この「開放される」とは何か? という点をまずは押さえるべきでしょう.
そしたら

int index = 10;
std::unique_ptr<int> A(&index);

のようなコードを書くことにはならないハズです.


質問①

make_sharedmake_unique はヘルパ関数的なものなので,使うことが強制されているわけではありません.
「アドレスで初期化する感じでもOK」です.
が,上述したように,あなたの書いたような例では問題があります.話を理解したうえで使いましょう.

質問②

過去に 同じ話の質問 がありましたので参照してください.

投稿2022/09/24 06:33

fana

総合スコア11658

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

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

fana

2022/09/24 06:42 編集

質問文の雰囲気が全体的に怪しい. 「所有権」とか「開放」とかいう言葉が具体的には何のことなのか? スマートポインタを使うと何がうれしいの? …っていうあたりの話をまずは把握すべきに見えます. > make_uniqueを使用する意味 に疑問を持つよりも前に,そもそも unique_ptr を使用する意味とは何か? みたいな.
退会済みユーザー

退会済みユーザー

2022/09/24 06:59

ご回答ありがようございます。 解放はメモリの解放。所有権はリソースのポインタの所有権でした。 スマートポインタを使う意味、あらためて調べたところ、動的に確保されたリソースをわざわざdeleteしなくてもスマートポインタが自動で管理してくれる。ということです。 例がおかしいと言われているのは、intのアドレスをセットしてしまっているからでしょうか。 intは別に動的にメモリを確保する必要がないのでスマートポインタに入れる必要もないということですね。
actorbug

2022/09/24 21:27

横から失礼します。 例がおかしいと言われているのは、intのアドレスをセットしているからでなく、関数を抜ければ自動で開放されるローカル変数のアドレスをセットしているからです。 以下のように、newで確保したintのアドレスをセットしていれば、このようなことは言われないはずです。 std::unique_ptr<int> A(new int{ 10 }); すでにベストアンサーにしているので、理解しているとは思いますが、念のため。
fana

2022/09/26 01:47

> 解放 は,デフォルトでは,保持するポインタに対して delete が実施される. そしたら,delete を実施してOKなポインタを保持させないとやばいっしょっていう. (「ローカル変数のアドレスに対して delete してやるぜ!」とかふつーはやらないっしょ.) 一度,スマートポインタを使わずに「new → delete を正しくやる」ための苦労を相応に経験してみることを個人的にはお勧めする.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問