удалить динамически выделенную память в openGL - PullRequest
1 голос
/ 10 сентября 2011

Я использую C ++ и и freeglut, и хочу знать, как удалить динамически выделенную память, используя new. Мне нужно освободить память при закрытии окна. Где я должен положить это delete pointer? до glutMainLoop()?

* Обновление *.

Например, я использую int *ptr = new int[n] для хранения координат вершин и не использовал класс в коде. Поэтому я должен позвонить delete в main(), чтобы освободить память. Я понимаю, что я могу использовать вектор, чтобы сделать то же самое. Но в моем случае, если мне нужно использовать new, как я могу освободить память?

Ответы [ 3 ]

3 голосов
/ 10 сентября 2011

Старая форма GLUT сделала так, что выполнение вашей программы никогда не возвращалось после вызова glutMainLoop.FreeGLUT избавляется от этого, но только если вы специально попросите об этом перед вызовом glutMainLoop:

glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_CONTINUE_EXECUTION);

Это означает, что когда вы в конце концов вызовете glutLeaveMainLoop, FreeGLUT продолжит с того места, где было glutMainLoopвызывается, как обычный вызов функции.

Так что, если вы выделите память до glutMainLoop, вы можете удалить эту память впоследствии.

При этом:

Я использую int *ptr = new int[n] для хранения координат вершин

Почему это не std::vector<int> mem(n); вместо указателя?Вы все еще можете получить указатель на память, выполнив &mem[0].И он будет убирать за собой.

2 голосов
/ 10 сентября 2011

См. Вопрос 3.0.70 в FAQ по OpenGL GLUT . Краткий ответ - использовать обработчик выхода, установленный с помощью вызова atexit ().

1 голос
/ 10 сентября 2011

Используйте умные указатели, и вам не нужно об этом беспокоиться.

...