【问题标题】:Lots of memory leaks大量内存泄漏
【发布时间】:2020-12-16 11:42:40
【问题描述】:

我已经安装了SFML,把我的项目属性放在SFML网站上,复制粘贴他们的默认代码:

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

#include <SFML/Graphics.hpp>

int main()
{
    sf::RenderWindow window(sf::VideoMode(200, 200), "SFML works!");
    sf::CircleShape shape(100.f);
    shape.setFillColor(sf::Color::Green);

    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
        }

        window.clear();
        window.draw(shape);
        window.display();
    }

    _CrtDumpMemoryLeaks();

    return 0;
}

但这给了我大量的内存泄漏。这是一些内存泄漏的图像:

为什么会出现所有这些内存泄漏?

【问题讨论】:

  • 你可以高枕无忧,忽略它们。考虑到您的代码示例,它们似乎是 SFML 需要拥有的静态对象。
  • 但是如何测试我的代码是否存在内存泄漏?我是 C++ 的初学者,所以我可能会不小心造成内存泄漏。
  • 如果你远离原始的拥有指针和赤裸裸的new,实际上内存泄漏并不是那么容易。经验法则:零 news 需要零 deletes。
  • 嗨,尝试使用所有包含和int main() { _CrtDumpMemoryLeaks(); }。由于静态对象,您可能会出现内存泄漏。检查最高分配编号,您以后可以只考虑该编号之后的内存泄漏。

标签: c++ sfml


【解决方案1】:

_CrtDumpMemoryLeaks(); 无法展望未来,也不知道在你调用它之后会破坏什么。

因此,这将报告泄漏:

int main() {
    int y = 0;
    int* x = new int;
     _CrtDumpMemoryLeaks();
    delete x;
}

这不会:

int main() {
    {
        int y = 0;
        int* x = new int;
        delete x;
    }
     _CrtDumpMemoryLeaks();
}

【讨论】:

  • 我在创建窗口之前放置了一个左括号,在 crtdump 之前放置了一个右括号,但它仍然报告所有内存泄漏
  • @JelleVos 真的所有泄漏了吗?还是只有在main 返回时才被销毁的静态对象泄漏?
  • 泄漏太多了,我真的看不出有没有消失。但我认为它们仍然存在。
猜你喜欢
  • 2013-09-02
  • 2015-03-07
  • 2013-03-11
  • 2011-03-20
  • 2011-06-26
  • 2023-04-07
  • 2012-03-29
  • 1970-01-01
相关资源
最近更新 更多