В настоящее время я работаю над проектом Vulkan, который использует библиотеку glfw для обработки окон.
Чтобы получить необходимые расширения, glfw предоставляет const char** glfwGetRequiredInstanceExtensions(uint32_t *count)
.
Чтобы избежать передачи const char** вместе со счетчиком, я написал простую вспомогательную функцию, которая преобразует const char** в std::vector<const char *>:
std::vector<const char *> GetRequiredInstanceExtensions()
{
uint32_t extensionCount = 0;
auto extensions = glfwGetRequiredInstanceExtensions(&extensionCount);
return std::vector<const char *>(extensions, extensions + extensionCount);
}
Я не уверен, как это работает с памятью. Насколько я понимаю, данные здесь копируются в вектор. Я не уверен, нужно ли очищать const**, который возвращается из glfwGetRequiredInstanceExtensions, и можно ли вообще использовать std::vector<const char *>. Вектор просто очищает указатели, а не все c-строки, когда он выходит за рамки, если я не ошибаюсь.
У меня здесь утечки памяти?
Из документации Vulkan на glfwGetRequiredInstanceExtensions()
:
Время жизни указателя
Возвращенный массив выделяется и освобождается GLFW. Вы не должны освобождать его самостоятельно. Он гарантированно действителен только до тех пор, пока библиотека не будет завершена.
Так что вам не нужно беспокоиться о памяти вообще. std::vector
уберет за собой и Вулкан тоже.
У меня здесь утечки памяти?
Всякий раз, когда вам нужно спросить себя: «Нужно ли мне освобождать этот голый указатель», ответ должен быть найден в документации. В этом случае:
Время жизни указателя
Возвращенный массив выделяется и освобождается GLFW. Вы не должны освобождать его самостоятельно. Он гарантированно действителен только до тех пор, пока библиотека не будет завершена.
Так что нет, у вас нет утечки памяти здесь.