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

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

詳細はこちら
C++11

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

ポインタ

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

Q&A

解決済

1回答

3060閲覧

unique_ptrでの動的配列についての質問

退会済みユーザー

退会済みユーザー

総合スコア0

C++11

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

ポインタ

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

0グッド

0クリップ

投稿2019/11/15 12:24

質問内容

下記にヒープ領域に整数型(int)を5つ格納できる配列を作るコードがあります。
クラスA内にその領域のアドレスを保管するメンバ変数Elementがあります。
そのメンバ変数Elementの型はunique_ptrですがオブジェクトがスコープを抜けた時
自動で開放されるのでしょうか?

非常に初歩的な質問ですがどうかご教授よろしくお願いします。
###ソースコード

c++

1#include<iostream> 2#include<memory> 3 4class A{ 5 private: 6 std::unique_ptr<int[]> Element; 7 int Size; 8 9 public: 10 ////////////////////////////////// 11 // 動的配列の確保とその中に値代入 12 ////////////////////////////////// 13 A(int NewSize){ 14 this->Size = NewSize; 15 this->Element.reset(new int[this->Size]); 16 for(int i=0;i<this->Size;i++){ 17 this->Element[i] = i; 18 } 19 } 20 21 //////////////////////////// 22 // デフォルトデストラクタ 23 //////////////////////////// 24 ~A() = default; 25 26 ///////////////////// 27 // 動的配列内表示 28 ///////////////////// 29 void Print(){ 30 for(int i=0;i<this->Size;i++){ 31 std::cout << this->Element[i] << std::endl; 32 } 33 } 34 35}; 36 37int main(){ 38 A a(5); 39 a.Print(); 40 41 return 0; 42}

###実行結果

0 1 2 3 4

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

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

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

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

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

guest

回答1

0

ベストアンサー

やってみりゃえぇやん。

C++

1#include <iostream> 2#include <memory> 3 4struct foo { 5 foo() { std::cout << "ctor\n"; } 6 ~foo() { std::cout << "dtor\n"; } 7}; 8 9int main() { 10 std::unique_ptr<foo[]> Element; 11 Element.reset(new foo[5]); 12}

投稿2019/11/15 12:39

episteme

総合スコア16612

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

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

退会済みユーザー

退会済みユーザー

2019/11/16 08:26 編集

返信おくれてしまい申し訳ございません。 ご回答していただき誠にありがとう御座います。 試しにintの部分を構造体Fooにして試してみましたが 確かにデストラクタとコンストラクタが必要回だけ実行されていたようです。 しかし私にはintで動かした場合の動きがイメージできません。 int型クラス内のデストラクタに自身の確保した領域を破棄するコードが書かれている という認識でよろしいでしょうか? めちゃくちゃなこと言ってたらすいません。 あとタイトルとは違う質問なのですが仕事でC++を使って行列クラスを作る場合 普通上記のようにunique_ptrをメンバ変数として使うものなのでしょうか? 教えていただけたら幸いです。 御返信お待ちしております。
episteme

2019/11/16 09:49

> int型クラス内のデストラクタに自身の確保した領域を破棄するコードが書かれている という認識でよろしいでしょうか? ちゃんと確保した数だけ後始末されてることが確認できたので、intでも同様で。 > 行列クラスを作る場合普通上記のようにunique_ptrをメンバ変数として使うものなのでしょうか? それでもいいし、固定長ならarray / 可変長なら vector あるいは valarray あたりかな。
退会済みユーザー

退会済みユーザー

2019/11/16 10:09

追加の質問にもお答えしていただき 誠にありがとう御座います。 おかげで今後メンバ変数のポインタをどう使っていこうか決まりました。 心より感謝申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問