0

XCode でフレームワークを開発しているときに、アプリケーションが「停止」ボタンを使用して XCode によって強制終了されるたびに、アプリケーションがメモリ リークするという異常なエラーが発生しました。スマート ポインターを慎重に使用して、フレームワークによって作成されたすべての動的メモリがヒープから正常にガベージ コレクションされていることを確認しました。スタック上のすべての型に有効なデストラクタがありました。

アプリケーションをハングアップさせた行は、 main() の最後にある null 参照でした。私の知る限り、その時点以降に割り当てられるメモリはなく、メモリがリークする方法もありませんでした。SIGABRT シグナルを受け取った後、「停止」を押すと、問題のあるビルドが終了しました。いくつかのプロファイラーで確認したところ、RAM が空っぽに吸い込まれていることがわかりました。

4

1 に答える 1

0

鍵となったのは、強制終了後に (同じビルドを) 再実行するとポップアップする OSX Lion の便利なウィンドウでした。「前回強制終了したこのアプリケーションのウィンドウを復元しますか?」という内容でした。

掘り下げた後、新しい OS アップグレード (Lion) が、新しい「Windows の復元」機能を介して、障害のあるアプリケーションの最後の状態をキャッシュしていたことがわかりました。アプリケーションを復元したかどうかに関係なく、状態キャッシュによって使用されるメモリが蓄積されていました。私はそれをオフにしましたが、今ではメモリリークはありません...今のところ。

OSX がビルドごとに新しい状態表現を作成した理由がわかりません。私の /Applications ディレクトリ内の他のアプリケーションでは、キャッシュされた状態は 1 つだけのようです (アプリケーションの終了/強制終了で開いているウィンドウごとに)。ただし、XCode のビルドごとに新しい状態が作成されているようです。個々のビルドが XCode で識別される方法に関係している可能性があります。または、OT 全体について完全に間違っている可能性があります。

于 2013-01-12T11:05:20.603 に答える