2017-02-05 9 views
-2

私はnullptrに初期化したいメンバ変数としてshared_ptrを使用するクラスを持っています。これはなぜ間違っているのですか?コンパイラのエラーメッセージは、 "delete:ポインタではないオブジェクトを削除できません"です。私のコンストラクタがshared_ptrに間違っているのはなぜですか?

template<class T> 
class Example: 
public: 
    Example() : myptr(make_shared<Example<T>>), val(0) {} 

private: 
    shared_ptr<Example<T>> myptr; 
    T val; 

これは私のshared_ptrを作成し、それをnullptrに初期化すると考えました。

正しいコンストラクタはどのように見えますか?

+1

どのようにあなたは、コンストラクタの外で 'make_shared'を使うのでしょうか? – juanchopanza

+1

関連しないメモ:型 'T'に唯一の引数として整数をとるコンストラクタがない場合はどうなりますか?あなたがデフォルトで 'val'を構築したいなら、val()'を使います。 –

+0

makeptrを使わずにmyptrをnullptrに初期化するだけです。 'Example():myptr {nullptr}、val {} {}' ? 実際にshared_ptrを宣言するだけで、デフォルトでnullに設定されます! – nitimalh

答えて

3

make_shared<Example<T>>は、関数呼び出しではなく、関数です。 shared_ptrを関数に初期化することは意味をなさない。あなたが得ているエラーは、shared_ptrが破壊されたときに機能を削除しようと試みるが、機能を削除できないためです。私はnullptr

に初期化したい

次に、あなたは、すべてのmake_sharedを望んでいません。それをnullptrに初期設定するだけです。 (または、コメントで指摘したように、完全に初期化を省略し、nullptrshared_ptrのデフォルト値であるから。)

+0

okこれは意味があります 実際に何かにポインタを割り当てるときにmake_shared関数を使うべきですか? –

+1

@Á.Márton 'make_shared'は、オブジェクトを作成したいときと、同時にそのオブジェクトを参照する' shared_ptr'を作成します。 – hvd

0

私は私がしたい メンバ変数としてのshared_ptrを使用するクラスを、持っていますnullptrに初期化します。

素晴らしい、何もしない。とにかくデフォルトのコンストラクタstd::shared_ptrがポインタを無効にします。何もする必要はありません。すべての

Example() : myptr(make_shared<Example<T>>), val(0) {}

まず、あなたがmake_sharedを呼び出す場合、あなたはあなたの割り当てられたことを確認することができますshared_ptr、あなたが新たに構築された管理対象オブジェクトを割り当てるNULLにすることはできませう!それはnewを呼び出すようなもので、共有ポインタでラップするとオブジェクトを無効にしません。

いますが、make_sharedを呼びたいならば、あなたは、通常の関数呼び出しのように括弧を追加する必要があります。

myptr(make_shared<Example<T>>(/*arguments*/)) 
関連する問題