std::shared_ptr
そのクラスのコピーを作成するときに心配する必要がないように、クラス内のいくつかの生のポインターをに置き換えたかったのです。ただし、生のポインターは動的配列を指します。動的配列でshared_ptrを使用するには、カスタム削除機能を指定します。g。default_delete<T[]>
。
しかし、構築中であっても、そのフィールドに新しい値を割り当てようとするとすぐに、大きなエラーリストが表示されます。
最小限のコードサンプルを次に示します。
#include <memory>
#include <cstddef>
using namespace std;
template<typename T> shared_ptr<T[]> make_shared_array(size_t size)
{
return shared_ptr<T[]>(new T[size], default_delete<T[]>());
}
struct Foo
{
shared_ptr<char[]> field;
};
int main()
{
Foo a;
// This line produces the error.
a.field = make_shared_array<char>(256);
return 0;
}
NB:vector
はい、動的配列の代わりにできる/すべきであることを私は知っています。しかし、それらのパフォーマンスは同じではありません。私はいくつかの重い画像処理を行い、配列はピクセルを保持します。VGA解像度未満では、処理時間が8秒から11秒に増加しました。それはかなりたくさんです。
更新:もちろん、ここでエラーを提供できます。問題の説明を乱雑にする必要があるかどうかはわかりませんでした。しかし、ここにあります:
C:\ Program Files(x86)\ Microsoft Visual Studio 11.0 \ VC \ INCLUDE \ memory(754):エラーC2664:'std :: _ Ptr_base <_Ty> :: _ Reset0':パラメーター1を'char 'から'charに変換できません()[]'
with
[
_Ty =char[]
]
ポイントされたタイプは無関係です。変換には、reinterpret_cast、Cスタイルのキャスト、または関数スタイルのキャストが必要です
。C:\ Program Files(x86)\ Microsoft Visual Studio 11.0 \ VC \ INCLUDE \ memory(723):関数テンプレートのインスタンス化への参照を参照してください'void std :: shared_ptr <_Ty > :: _ Resetp0 <_Ux>(_ Ux *、std :: _ Ref_count_base *)'は
[
_Ty
= char []、
C:\ Program Files(x86)\ Microsoft Visual Studio 11.0 \ VC \ INCLUDE \ memory(723):関数テンプレートのインスタンス化への参照を参照'void std :: shared_ptr <_Ty> :: _ Resetp0 <_Ux>(_ Ux *、std: :_Ref_count_base *)' [ _Ty = char []、 _Ux = char ]
でコンパイル C:\ Program Files(x86)\ Microsoft Visual Studio 11.0 \ VC \ INCLUDE \ memory(494):関数テンプレートのインスタンス化への参照を参照' void std :: shared_ptr <_Ty> :: _ Resetp <_Ux、_Dx>(_ Ux *、_ Dx)'は [ _Ty = char []、 _Ux = char、 _Dx = std::default_delete ]でコンパイルされます
C:\ Program Files(x86)\ Microsoft Visual Studio 11.0 \ VC \ INCLUDE \ memory(494):関数テンプレートのインスタンス化への参照を参照'void std :: shared_ptr <_Ty> :: _ Resetp <_Ux、_Dx>(_ Ux *、 _Dx)'は
[
_Ty
= char []、
_ Ux = char、
_Dx = std :: default_delete
] problem.cpp
(9)でコンパイルされます:関数テンプレートのインスタンス化への参照を参照してください' std :: shared_ptr <_Ty> :: shared_ptr>( _Ux *、_ Dx)'は
[
_Ty
= char []、
T = char、
_Ux = char、
_Dx = std::default_delete
]でコンパイルされます
problem.cpp(9):[_ Ty = char []、
T = char、 _Ux = char、 _Dx = std :: default_delete ] problem.cpp(21): [ _Ty =char[] ] でコンパイル さ れている関数テンプレートのインスタンス化'std:: shared_ptr <_Ty> make_shared_array(size_t)'への参照を参照してください。