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

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

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

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

6099閲覧

C++のstd::shared_ptrの配列につきまして

oldstance

総合スコア11

C++

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/02/21 09:06

お世話になります。

C++のstd::shared_ptrの配列についての質問です。

c++

1 std::shared_ptr<int> buffer(new int[10], std::default_delete<int[]>()); 2

とすることでdelete[]を呼び出してくれる配列版のstd::shared_ptrを作成することはわかるのですが、事前に

c++

1 std::shared_ptr<int> buffer;

としておき、後で実態(?)を生成することは可能でしょうか?
できれば、int[10]としているところも、何らかの計算で得た配列長を指定したいです。

例えば以下のような感じを想定しています。

c++

1class Image 2{ 3public: 4 Image() {} 5 ~Image() {} 6 7 void create( int width, int height ); 8 9protected: 10 std::shared_ptr<char> buffer; 11}; 12 13void Image::create( int width, int height ) 14{ 15 int length = width * height; 16 buffer = <ここでlength分のcharの配列を作成してstd::shared_ptrの制御下にしたい>; 17}

以上、宜しくお願い致します。

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

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

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

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

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

guest

回答2

0

C++17がないとちょっと扱いづらくなりますが
C++17でないとstd::shared_ptr<char[]> buffer;は使えないようでした。

c++

1std::shared_ptr<char[]> buffer; 2 3void Image::create( int width, int height ) 4{ 5 int length = width * height; 6 buffer.reset(new char[length]); 7}

C++14以前ですと

c++

1std::shared_ptr<char> buf; 2void Create(int x, int y){ 3 buf.reset(new char[x*y], std::default_delete<char[]>()); 4}

になります。

投稿2020/02/21 10:38

編集2020/02/22 04:39
asm

総合スコア15147

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

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

oldstance

2020/02/21 11:48

asmさま、ご回答ありがとうございます。 動かしてみたのですが、初期化されていないbufferに対しての操作はできませんでした。
oldstance

2020/02/22 02:33

asm様、ご回答ありがとうございます。 そういえば環境書いていませんでしたね。申し訳有りません。 VisualStudio 2019 Comunnityを使用しております。
oldstance

2020/02/22 06:04

asm様、ご回答ありがとうございます。 こちらでも動作確認して使えることがわかりました。 大変有り難うございます。
guest

0

ベストアンサー

こんにちは。

できれば、int[10]としているところも、何らかの計算で得た配列長を指定したいです。

std::shared_ptr<std::vector<int> >とすればスマートと思います。

投稿2020/02/21 09:40

Chironian

総合スコア23272

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

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

oldstance

2020/02/21 10:16

Chironian様、ご回答ありがとうございます。 配列長を指定する場合は、 std::shared_ptr<std::vector<int>> buffer; int length = 確保する配列長; buffer = std::make_shared<std::vector<int>>(length); でよろしかったでしょうか?
yumetodo

2020/02/21 10:24

lengthの型はsize_tが望ましいんじゃないですかね。重箱の隅をつつくようですが。
oldstance

2020/02/21 10:44

yumetodo様、ご回答ありがとうございます。 そうですね、サンプルだとしてもintではなくsize_tにするべきでしたね。 以後気をつけます。
Chironian

2020/02/21 13:12

oldstanceさん 間違いではないのですが、bufferへshared_ptrを新たに代入した時点で共有が解除されます。 buffer->resize(10);のような方法でstd::vectorを変更すれば、共有が維持されます。 https://wandbox.org/permlink/HNQh0h2Ys7uivE8z
oldstance

2020/02/22 02:31

Chironian様、ご回答ありがとうございます。 素直にstd::vectorを使うようにしました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問