【问题标题】:Use of autoreleased objects in C++ code在 C++ 代码中使用自动释放的对象
【发布时间】:2013-08-19 16:45:33
【问题描述】:

我目前正在编写代码以从 NSView 获取 OpenGL 纹理。该代码主要是 Apple 示例代码。但是,我需要在 C++ 类中使用它,并且有泄漏对象的问题。

这是代码中有趣的部分:

GLuint CPlusPlusClass::openGLTexFromNSView(NSView* theView)
{
    GLuint texName = 0x0;

    @autoreleasepool // 1
    {  // 1
        NSBitmapImageRep* bitmap = [theView bitmapImageRepForCachingDisplayInRect:[theView visibleRect]];

        int samplesPerPixel = 0;
        [theView cacheDisplayInRect:[theView visibleRect] toBitmapImageRep:bitmap];

        samplesPerPixel = (int)[bitmap samplesPerPixel];

        glPixelStorei(GL_UNPACK_ROW_LENGTH, (int)([bitmap bytesPerRow]/samplesPerPixel));
        glPixelStorei (GL_UNPACK_ALIGNMENT, 1);

        glGenTextures (1, &texName);

        glBindTexture (GL_TEXTURE_RECTANGLE_ARB, texName);
        glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

        if(![bitmap isPlanar] && (samplesPerPixel == 3 || samplesPerPixel == 4))
        {
            glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0,
                         samplesPerPixel == 4 ? GL_RGBA8 : GL_RGB8,
                         (int)[bitmap pixelsWide], (int)[bitmap pixelsHigh],
                         0, samplesPerPixel == 4 ? GL_RGBA : GL_RGB,
                         GL_UNSIGNED_BYTE, [bitmap bitmapData]);
        }
    } // 1
    return texName;
}

当我将视图绘制到 OpenGL 上下文并在 Activity Monitor 中检查应用程序的内存占用时,我看到每次 Activity Monitor 的视图刷新时,该数字都会增加大约 4 MB。通过在代码中添加由//1 指示的@autoreleasepool 块,我可以将它降低到每个刷新周期大约2 MB。尽管如此,它仍在不断增加。

从 C++ 中释放自动释放对象的正确方法是什么?

【问题讨论】:

    标签: objective-c opengl objective-c++ autorelease


    【解决方案1】:

    那不是C++,是Objective-C++

    间接回答了问题;您在 Objective-C++ 中管理 Objective-C 对象的方式与在直接的 Objective-C 中完全一样。

    对于手动线程,您需要手动管理自动释放池。确保在线程中第一次调用 Objective-C 之前有一个池,并确保它在线程退出之前被耗尽。如果线程长期存在,那么您将需要定期创建和排出自动释放池(就像它们自动在运行循环中一样)。

    【讨论】:

    • 但这就是我认为我对 @autoreleasepool 块所做的事情。我在函数末尾用[[NSAutoreleasePool alloc] init][pool drain] 交换了@autoreleasepool,结果相同。顺便说一句,这是从每个视频帧的硬件回调线程调用的。
    • 鉴于缺乏额外的代码,这是一个一般性的答案。我曾假设您正在增加 Objective-C 对象。糟糕的假设!我对 gl API 的知识非常缺乏。
    【解决方案2】:

    事实证明,我对@autoreleasepool 所做的事情是绝对正确的。

    我上面概述的函数每秒调用大约 50-60 次。 我发现增加的内存负载是由glGenTextures 的重复调用产生的。它应该存储在一个变量中,而不是每次都被覆盖。

    我不认为这有问题。 以为是自动释放池相关...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-15
      • 1970-01-01
      • 2013-09-07
      • 1970-01-01
      • 1970-01-01
      • 2011-12-18
      • 2011-03-05
      • 1970-01-01
      相关资源
      最近更新 更多