2012-07-13 24 views
0

以下示例使用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); 
     } 
    } 
} 

}; 

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

回答

0

这就是为什么valgrind被创建。确保使用调试符号(例如g ++为-g)编译应用程序并运行:

valgrind --leak-check=full ./your_program --args --to --your program 
相关问题