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类,但我想我的错误是非常基本的,所以有人可能能够看到它基于这个片段。