質問するログイン新規登録

回答編集履歴

1

weak_ptrについて追記

2017/03/05 01:52

投稿

hmmm
hmmm

スコア818

answer CHANGED
@@ -14,4 +14,28 @@
14
14
  例えば上記で受け取ったポインタをSpriteListのインスタンスが破棄されたあとに
15
15
  使用すると不正なメモリにアクセスすることになります。
16
16
  SpriteListクラスを使用するプログラマは上記を常に意識しなければいけません。
17
- shared_ptrもしくはweak_ptrで返却してあげれば、その心配がありません。
17
+ shared_ptrもしくはweak_ptrで返却してあげれば、その心配がありません。
18
+
19
+ 追記
20
+ weak_ptrについてコメントをいただいたので追記します。
21
+
22
+ weak_ptrはsahred_ptrが必ず取得できるわけではありません。
23
+ ですので、通常は以下のように使います。
24
+
25
+ ```c++
26
+ auto shared = weakptr.lock();//shared_ptr<>を取得
27
+ if(shared){//使えるか確認
28
+ shared->render();//使う。
29
+ //shared_ptrで参照カウントがカウントアップされているので安全に使える。
30
+ }
31
+ ```
32
+
33
+ 以下はダメな例です。
34
+
35
+ ```c++
36
+ if(weakptr.lock()){
37
+ weakptr.lock()->render();//危ない!!
38
+ }
39
+ ```
40
+
41
+ 最初のロックと2回目のロックの間にweakptrで監視しているshared_ptrが破棄されている場合があります。