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

回答編集履歴

2

追加

2016/03/12 19:02

投稿

退会済みユーザー
answer CHANGED
@@ -15,4 +15,4 @@
15
15
 
16
16
  ちなみに[removeFromParentAndCleanup(true)](http://www.cocos2d-x.org/reference/native-cpp/V3.0alpha0/d3/d82/classcocos2d_1_1_node.html#a56ae8e6cfb617d66b934e10dfc6f2bdc)はスプライトの参照カウントを-1して,スプライトなどに設定されているアクションなどを消すメソッドで,参照カウントが0になっていればそのオブジェクトは削除されますが,明示的にメモリを解放しているわけではありません。リンク先の公式ドキュメントが一番わかりやすく正しい情報が載っていると思うので,参考にしてください。
17
17
 
18
- おそらくappDelegate.cpp中で前のシーンオブジェクトがメインルーチンから抜けるまで破棄されないので,メモリが解放できていないのだと思います。シーンオブジェクトが解放されてもシーンオブジェクトのメンバのメモリまで解放されているとは限らないので,シーンを抜ける時はデストラクタでやサブルーチンをブレイクする段階で全てのオブジェクトの参照カウントが0になることを保証しておいたほうが安全だと思います。
18
+ おそらくappDelegate.cpp中で前のシーンオブジェクトがメインルーチンから抜けるまで破棄されないので,メモリが解放できていないのだと思います。シーンオブジェクトが解放されてもシーンオブジェクトのメンバのメモリまで解放されているとは限らないので,シーンを抜ける時はデストラクタでやサブルーチンをブレイクする段階で全てのオブジェクトの参照カウントが0になることを(AutoReleasePool::clear()をループで実行するなどして)保証しておいたほうが安全だと思います。

1

情報追加

2016/03/12 19:02

投稿

退会済みユーザー
answer CHANGED
@@ -4,8 +4,15 @@
4
4
 
5
5
  cocos2d-x名前空間のObjectクラスやNode派生クラスはコンテナ格納時とコンテナ解放時に自動で参照カウントを増減してくれますが,生成時にインクリメントされた参照カウントだけはreleaseやAutoReleasePoolによって明示的に解放しなければいけません。これはデストラクタやサブルーチンをブレイクする時に実行するようにするといいと思います。
6
6
 
7
- また,AutoReleasePoolを使用する場合,インスタンスの初期化時にautorelease()メソッドを呼んでおく必要が有ります。
7
+ また,AutoReleasePoolを使用する場合,インスタンスの初期化時にautorelease()メソッドを呼んでおく必要が有ります(これはcocos2d-xのコンストラクタをオーバーライドしていなればcreate()実行時に自動で呼ばれます)
8
8
 
9
9
  [ぽこつん研究所 201研究室 オブジェクトの継承](http://rooms.pokotsun-labs.net/201/%E5%9F%BA%E6%9C%AC%E7%B7%A8/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E7%B6%99%E6%89%BF)
10
10
 
11
- を参考にしてください。ただ情報が古いため,もしかするともっと良い機能に置き換えられている可能性があります。メモリが解放されていない根本的な原因は,オブジェクトのreleaseが上手くできていないことなので,それを解決するようにメソッドや処理などを書くことで解決します。
11
+ を参考にしてください。ただ情報が古いため,もしかするともっと良い機能に置き換えられている可能性があります。メモリが解放されていない根本的な原因は,オブジェクトのreleaseが上手くできていないことなので,それを解決するようにメソッドや処理などを書くことで解決します。
12
+ 以下の記事も参考になります。
13
+
14
+ [cocos2d-xのリファレンスカウンタを理解してクラッシュやメモリリークを防ぐ](http://brbranch.jp/blog/201311/cocos2d-x/cocos2dx_memory_leak/)
15
+
16
+ ちなみに[removeFromParentAndCleanup(true)](http://www.cocos2d-x.org/reference/native-cpp/V3.0alpha0/d3/d82/classcocos2d_1_1_node.html#a56ae8e6cfb617d66b934e10dfc6f2bdc)はスプライトの参照カウントを-1して,スプライトなどに設定されているアクションなどを消すメソッドで,参照カウントが0になっていればそのオブジェクトは削除されますが,明示的にメモリを解放しているわけではありません。リンク先の公式ドキュメントが一番わかりやすく正しい情報が載っていると思うので,参考にしてください。
17
+
18
+ おそらくappDelegate.cpp中で前のシーンオブジェクトがメインルーチンから抜けるまで破棄されないので,メモリが解放できていないのだと思います。シーンオブジェクトが解放されてもシーンオブジェクトのメンバのメモリまで解放されているとは限らないので,シーンを抜ける時はデストラクタでやサブルーチンをブレイクする段階で全てのオブジェクトの参照カウントが0になることを保証しておいたほうが安全だと思います。