为什么我的内存占用增长?

时间:2012-07-13 16:04:13

标签: c++ ios memory-leaks openframeworks

以下示例使用openFrameworks工具包,但我想我的错误不是特定于openFrameworks的,所以我希望有人可以提供帮助。

我使用xThreadedImageLoader动态加载图片。我使用另一个线程来卸载/删除。我把我的问题浓缩成了一小段代码。在这个例子中我不需要删除线程,但我确实需要在我的真实程序中使用它,这就是为什么它在这里。 (另外如果我在主循环而不是线程中删除,我就不会遇到问题。通过线程,它就像图像被复制到某处,只有一个副本被删除。)

void testApp::setup(){  
alreadyLoaded = false;
tmpImage = new ofImage();

loader.loadFromDisk(tmpImage, "images/test.png");
loader.startThread(true, false);
imageDeleter.start();

}


void testApp::update(){
bool alreadyLoaded = tmpImage->isUsingTexture();

if(alreadyLoaded) {
    ofTexture& tex = tmpImage->getTextureReference();
    alreadyLoaded = tex.bAllocated();
}

if(alreadyLoaded) { 
    imageDeleter.addImageToDelete(tmpImage);

    tmpImage = new ofImage();
    int nImages = DIR.listDir("images/");

    loader.loadFromDisk(tmpImage, DIR.getPath((int) ofRandom(nImages)));
}
}

更新是程序主循环。这是线程删除:

class threadedDelete : public ofxThread{

public:
deque<ofImage *> images_to_delete;

//--------------------------
threadedDelete() {

}


threadedDelete(ofImage*  _imageToDelete){
    lock();
    images_to_delete.push_back(_imageToDelete);
    unlock();
}


void addImageToDelete(ofImage*  _imageToDelete) {
    lock();
    images_to_delete.push_back(_imageToDelete);
    unlock();
}

void start(){
    startThread(true, false);   // blocking, verbose
}

void stop(){
    stopThread();
}

//--------------------------
void threadedFunction(){
    while(isThreadRunning()){
        if (images_to_delete.size() > 0) {
            lock();

            ofImage  * imageToDelete(images_to_delete.front());
            ofLog(OF_LOG_NOTICE, "deleting " + ofToString(imageToDelete)); 
            images_to_delete.pop_front();
            delete imageToDelete;

            unlock();
        }
        else {
            ofSleepMillis(50);
        }
    }
}

};

所以基本上我只是加载一个随机图像,当它被加载时,我删除它并加载另一个。即使每个新的ofImage都被删除,我的内存占用量也会增加,直到我收到内存警告(iOS)并且我的应用程序崩溃。我错过了什么? 正如我所说,我知道代码使用的是openFrameworks类,但我想我的错误非常基本,所以有人可能会根据这个代码片段看到它。

1 个答案:

答案 0 :(得分:0)

这就是创建valgrind的原因。确保使用调试符号(例如,对于g ++ -g)编译应用程序并运行:

valgrind --leak-check=full ./your_program --args --to --your program