在C ++代码中使用自动释放的对象

时间:2013-08-19 16:45:33

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

我正在编写代码以从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。通过在代码中添加@autoreleasepool指示的//1块,我可以将其降低到每个刷新周期大约2 MB。不过,它还在不断增加。

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

2 个答案:

答案 0 :(得分:4)

不是C++,而是Objective-C++

间接回答了这个问题;您可以像在Objective-C中一样管理Objective-C ++中的Objective-C对象。

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

答案 1 :(得分:0)

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

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

我没有考虑到这方面存在问题。 以为是自动释放池相关...