【问题标题】:glewInit() Causes memory leak according to valgrindglewInit() 根据 valgrind 导致内存泄漏
【发布时间】:2021-04-20 21:10:24
【问题描述】:

我正在尝试调试和修复程序中的所有内存泄漏。我浏览了整个源代码,没有一个调用newmalloc() 不受free()delete 支持。我尝试在 valgrind 中运行该程序。 Valgrind 发现一致的(在程序的多次执行中)844 字节的数据肯定丢失了。它还不断地让我回到 Window 类的 glewInit() 函数。是不是我做错了什么?

注意几点:

  • 我的窗口类是完全静态的
  • 我的窗口类调用InputManager::init(),它也是一个静态类
  • 我还有另一个用于存储常量的完全静态类
class Window {
public:

     // void create(unsigned int width, unsigned int height, const std::string& name, bool resizable, bool decorated){
    //
    // }

    static void create(unsigned int width, unsigned int height, const std::string& name, bool resizable, bool decorated){

         if(!glfwInit()){
              Utils::log("Failed to initialize GLFW");
            return;
         }


         //Setting Window settings
         glfwWindowHint(GLFW_RED_BITS, 8);
         glfwWindowHint(GLFW_GREEN_BITS, 8);
         glfwWindowHint(GLFW_BLUE_BITS, 8);
         glfwWindowHint(GLFW_ALPHA_BITS, 8);
         glfwWindowHint(GLFW_DEPTH_BITS, 24);
         glfwWindowHint(GLFW_STENCIL_BITS, 8);
         glfwWindowHint(GLFW_DOUBLEBUFFER, GLFW_TRUE);
         glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
         glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
         glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
         glfwWindowHint(GLFW_SAMPLES, 4);
         glfwWindowHint(GLFW_RESIZABLE, resizable ? GLFW_TRUE : GLFW_FALSE);
         glfwWindowHint(GLFW_DECORATED, decorated ? GLFW_TRUE : GLFW_FALSE);

         m_width = width;
         m_height = height;

    #ifdef __APPLE__
         glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
    #endif

         //Creating the window
         window = glfwCreateWindow(width, height, name.c_str(), NULL, NULL);
         if(!window){
              Utils::log("Window: Failed to create window");
            return;
         }

         //Settings for window
         glfwSwapInterval(1);
         glfwSetFramebufferSizeCallback(window, windowResized);

         //Creating the context for opengl
         glfwMakeContextCurrent(window);

         //Initializing glew
         if(glewInit() != GLEW_OK){
              Utils::log("Window: Failed to initialize glew");
         }

         //Enabling transparency
         glEnable(GL_BLEND);
         glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

         //Enabling depth
         glEnable(GL_DEPTH_TEST);
         glClearDepthf(1.0f);

         //Enabling back face culling
         glEnable(GL_CULL_FACE);
         glCullFace(GL_BACK);

         //Enabling MSAA
         glEnable(GL_MULTISAMPLE);

         InputManager::init(window);

    }
     static void clear();
     static void update();
     static void close();

     //Window functions
     static void setVerticalSyncEnabled(bool enabled);
     static void setMouseCursorGrabbed(bool grabbed);
     static int getWidth();
     static int getHeight();
     static bool isResized();

     static bool isCloseRequested();

     static GLFWwindow* window;


private:

     static void windowResized(GLFWwindow* window, int width, int height);

     static int m_width;
     static int m_height;

     static bool m_isResized;
     static bool m_closeRequested;


};
#endif

【问题讨论】:

  • OpenGL 似乎以泄漏而闻名(但它可能处于控制之下 - 他们知道它不会泄漏,直到程序结束)。如果您没有找到任何已经制作的文件,您可以创建 valgrind 抑制文件。许多故意泄漏的库(如 OpenCV、ncurses、OpenMPI 等)随库提供 valgrind 抑制文件。它们通常称为something.supp。虽然我没有找到任何关于 OpenGL 的内容,但是网上有很多关于如何自己制作的指南。
  • 有趣.. 那就放心了。所以我想这是一个我可以忽略的问题?
  • 我的反应和你一样,发现“我的”泄漏令人不安并想要堵住它们。当我阅读有关库并发现泄漏存在并且它们不被认为是错误时,但故意因为操作系统会清理它,我尝试获取抑制文件。忽略一个库的 valgrind 输出可能很困难,而且经常会妨碍自己发现问题。如果我导致泄漏并且它隐藏在 100000 行库泄漏中的某个地方,我可能会错过它。
  • 这很聪明。谢谢你的建议!

标签: c++ opengl memory glew


【解决方案1】:

我开始使用 GLAD,但它停止导致内存泄漏。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-30
    • 2013-06-24
    • 2020-03-31
    • 2016-03-15
    • 2014-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多