学习C ++和SDL-以下是否会产生内存泄漏?

时间:2011-01-05 00:31:57

标签: c++ pointers memory-management memory-leaks sdl

我自己学习了一些C ++,而且我不完全确定我对内存管理有很好的把握。我只了解Java和一些PHP和Python,所以这对我来说有点新鲜。我也在使用SDL - 这似乎是一种加速学习过程的有趣方式。无论如何,我正在尝试编写一个清理函数来释放已经传递给堆栈的所有表面(我只是使用堆栈STL)。所以,我有以下代码(缩写):

#include <stack>

//stack of SDL_Surfaces  
stack<SDL_Surface*> surfaces;

void clean() {      
    SDL_Surface *temp = NULL;

    //loops through the stack depending on its size
    while (surfaces.size() != 0) {
        temp = surfaces.top();
        SDL_FreeSurface(temp);
        surfaces.pop();

    } //while
    if (surfaces.size() == 0) {
        cout << "cleanup worked correctly" << endl;     
    } //if
}

//loading an image (this is in the main function)
background = load_image( "background.bmp" );
surfaces.push(background);

//cleaning time
clean();

我不确定清理方法。我认为这是实现SDL_FreeSurface函数的更好方法,而不是手动指定每个曲面。因此,如果我在屏幕上绘制了十个图像(比如十个星舰),然后将它们炸掉,我需要正确删除它们。我会为这10个星舰创建一个堆栈,然后在它们被毁坏后我可以将它们全部擦掉,如果这有意义的话。我担心我过于复杂,并引入了一种全新的方式来导致内存泄漏。

非常感谢任何反馈/评论!我是C ++的新手,所以请随意模仿我对内存管理的徒劳尝试。

5 个答案:

答案 0 :(得分:2)

您自己的代码没有任何内存泄漏。假设load_image()也是安全的,整个代码都没有内存泄漏。

请记住,如果您不使用new运算符,则不会发生内存泄漏。

答案 1 :(得分:1)

你正在做的事情有点令人困惑但是,如果SDL_FreeSurface()释放了对象(???),那么我看不到内存泄漏。

你想做什么? SDL_FreeSurface()有什么作用? load_image()做了什么以及如何分配内存呢?

答案 2 :(得分:1)

这似乎没有任何内存泄漏。但是,您要确保不要将表面保持太长时间,否则可能会出现泄漏(Java中可能会发生同样的情况)。假设经常调用clean,你应该没问题。

这解决了清理单个表面的问题(通过在适当的时间调用SDL_FreeSurface)来清理表面堆栈(通过在适当的时间调用clean)。如果您已经有管理堆栈的代码(或想法),我会继续使用它。如果没有,我会尝试找到一种单独管理表面寿命的方法,因为这种方法更灵活,不会引入新的概念。

答案 3 :(得分:0)

阅读RAII - C ++非常擅长。一旦你理解了发生了什么(基本上它是构造函数中的资源分配和析构函数中的释放 - 意味着你的对象自己清理) - 你可以为SDL函数创建漂亮的包装器。这是你如何做表面的:

CBitmapSurface::CBitmapSurface(const std::string &filename) 
{
    m_pSurface = SDL_LoadBMP(filename.c_str());
}

CBitmapSurface::~CBitmapSurface()
{
    SDL_FreeSurface(m_pSurface); 
}

其中m_pSurface是SDL_Surface *。

类型的成员变量

在完美世界中,您希望使此类不可复制,如果使用c ++ 0x并检查错误代码并抛出异常,则处理移动构造函数。但这应该让你开始。

答案 4 :(得分:0)

到目前为止寻找内存泄漏的最佳方法是使用valgrind。据我所知,它仅适用于Linux,但值得花时间进行调查和使用。