2016-10-08 7 views
-1

このゲッターの後にメモリを解放する必要がありますか?はいの場合、unique_ptrでどうすればよいでしょうか?ポインタを作るゲッターを使用するunique_ptr

私は

std::unique_ptr<sf::RectangleShape> operator()() 
{ 
    return std::unique_ptr<sf::RectangleShape>(player); 

} // RectangleShape Getter 

をしようとしたが、それは括弧のオペレータに該当する機能はありませんと言います。どのようにこれを行う必要がありますか?

+0

ユニークなポインタは、 'make_unique'から返されるか、そうでなければ' new'式の値から構築されなければなりません。 –

+4

'プレーヤー 'とは何ですか? – Galik

+0

最初の例でアドレスを取っているので、 'player'はポインタではないようです。 – krzaq

答えて

0
sf::RectangleShape* operator()() 
{ 
    return &player; 

} // RectangleShape Getter 

Do I need to free memory after this getter?

あなたが行うすべてはplayerへのポインタを返すです。それがstruct/classのメンバ変数であり、上記のメンバ関数がその一部であると仮定すると、その寿命は、その関数を呼び出したオブジェクトの存続期間に縛られます。これは悪い考えであることを意味し、特に

sf::RectangleShapeを想定し

struct Foo { 
    sf::RectangleShape player; 
    // ... 
    // insert your operator here 
}; 

sf::RectangleShape * some_function(void) { 
    Foo f; 
    return f(); // UB, returning pointer to object with automatic memory whose lifetime has ended 
} 

[..] how would one do this with unique_ptr?

は、コピーコンストラクタを持っている、あなたはplayerのコピーを作ることができる:

std::unique_ptr<sf::RectangleShape> operator()() { 
    return make_unique<sf::RectangleShape>(player); 
} 

コピーあなたはその方法を "あなたのもの"にします。つまり、あなたが望むように生涯を管理することができます。

+0

それで 'make_unique'を使うとコピーを作るのと同じプロパティを持つ同じオブジェクトですか? – kim366

+0

コピーです。もちろん、このタイプのオブジェクトを実際にコピーすることはできます。 –

+0

さて、同じオブジェクトでなければならないので、そのメソッドは実行可能ではありません。ありがとうございました! – kim366

1

playerはクラスのメンバで、クラスの外で修正するためのポインタを渡そうとしていますか?

この場合、それが属するクラスはメモリを所有し、破壊されたときにデータを解放するためにそのクラスにまで下がります。そのメンバへのポインタは、クラスの外部から絶対に解放されるべきではありません。

これは、所有クラスの詳細を知る助けになりますが、playerがデータメンバーであると仮定できれば、最初の例は技術的には問題ありません。しかし、ポインタよりも参照を返す方が慣れていることがよくあります。

class SomeClass 
{ 
    sf::RectangleShape player; 
    sf::RectangleShape& operator()() 
    { 
     return player; 
    } 
}; 

上記の仮定が間違っている場合は、完全なクラス定義を表示して、正しい解決策を形成するための詳細情報を入手する必要があります。

+0

あなたの前提は正しいと私は参照を介してポインタを使用する唯一の理由は、それはコピーではなく、確かにメンバ変数であり、それは慎重に処理する必要がありますクラス外より明確です。私が今まで知っていた限りでは、ポインタ変数を作るときや 'new'キーワードを使うときにメモリ管理を気にする必要があります。あれは正しいですか? – kim366

+1

ダイナミックメモリ割り当てがあるときはいつでもメモリを解放することを心配する必要があります。 'new'かCスタイルの' alloc'バリアントのいずれかを使用します。これらは、リソースが関数内で作成され、関数から返される場合、またはオブジェクトが大きすぎてスタックに直接割り当てることができない場合に、伝統的に使用されます。 ptrが有効範囲外になったときに自動的にリソースがクリーンアップされるので、 'make_unique'関数を使って' unique_ptr'を作成するほうが良い場合がよくあります。 'ptr.get()'関数を使って、 ... cont cont ... – djrollins

+1

を渡すことができる生のポインタを得ることができるので、他の人がリソースを変更することができます。しかし、彼らはそれを解放しようとすべきではありません。 ポインタは、本質的に動的メモリ割り当てを意味するものではありません。たとえば、変数をスタックするためのポインタを作成できます。だからあなたは本当に誰が**オブジェクトを所有しているのか、それがどこに割り当てられているのか考える必要があります。 これは、リソースに所有権に基づいて暗黙的にライフタイムを与えるため、メモリを解放することを心配する必要がないため、スマートポインタを生ポインタよりも推奨する理由です。 未処理のポインタを解放した後でも、未処理のポインタを 'unique_ptr'データにぶら下らないように注意する必要があります。 – djrollins

関連する問題