【问题标题】:Not able to trace C++ leaks with instruments无法使用仪器跟踪 C++ 泄漏
【发布时间】:2013-10-01 10:17:48
【问题描述】:

我在我的 Objective-C 应用程序中使用 C++,并在场景中进行以下分配:

@interface Game1PlayerLayer : CCLayer {

    b2World *_world;
    GLESDebugDraw *_debugDraw;
    MyContactListener *_contactListener;
}

+(CCScene *) scene;

@end

在实施中我分配:

_world = new b2World(gravity);
_debugDraw = new GLESDebugDraw(PTM_RATIO);
_contactListener = new MyContactListener();

当然我必须用

来释放它们
delete _world;
delete _debugDraw;
delete _contactListener;

但如果我不删除它们,Xcode Leaks 工具不会显示这些泄漏。我当然检查了Game1PlayerLayer 的释放。泄漏仪器设置为 1 秒快照。如果 Xcode 能够显示 C++ 泄漏,我应该如何跟踪它们?

【问题讨论】:

    标签: c++ ios xcode memory-leaks cocos2d-iphone


    【解决方案1】:

    如何避免整个问题并改用std::shared_ptr

    @interface Game1PlayerLayer : CCLayer {
    
        std::shared_ptr<b2World> _world;
        std::shared_ptr<GLESDebugDraw> _debugDraw;
        std::shared_ptr<MyContactListener> _contactListener;
    }
    
    
    _world.reset(new b2World(gravity));
    _debugDraw.reset(new GLESDebugDraw(PTM_RATIO));
    _contactListener.reset(new MyContactListener());
    
    
    #if 0
    delete _world;
    delete _debugDraw;
    delete _contactListener;
    #endif
    

    【讨论】:

    • “避免问题”意味着我不必检查 C++ 对象的泄漏,否则泄漏将在 Instruments 中正确显示?
    • @Pablo 这意味着您根本不必担心它。将指针作为std::shared_ptr&lt;X&gt; 传递,您应该确保它不会泄漏。
    • 将 boost 库集成到 Xcode 项目中看起来并不容易 :) 许多人报告了几十个错误,但没有人报告成功案例(据我目前所见):) 将继续挖掘,但如果你能简要介绍一下告诉从哪里下载(macports/sources)以及是否使用构建静态库和链接或将源包含到项目中?
    • @Pablo 它是标准库的一部分(您可能需要-std=c++11-stdlib=libc++,具体取决于您的部署目标)。
    • 好的,请多多包涵 :) 我在头文件中做了#import &lt;tr1/boost_shared_ptr.h&gt;。然后在LLVM 5.0 C++ Language Dialect 中设置-std=c++11,在C++ Standard Library 中设置libstdc++。我有几十个编译器错误,例如`命名空间'__gnu_cxx'中没有名为'_Lock_policy的成员。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-02
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    • 2012-06-11
    相关资源
    最近更新 更多