#c
Вопрос:
Таким образом, приведенный выше вопрос в значительной степени объясняет мою проблему, у меня есть программа, которая печатает размер кода моего шейдера фрагментов и шейдера вершин, это часть моего проекта игрового движка, над которым я работал в течение последних нескольких дней в качестве учебного опыта, чтобы получить больше знаний о программировании на C низкого уровня, но проблема в том, что когда я перечисляю, где в проекте размещены оба шейдера, моя программа аварийно завершается утечкой памяти, мне нужен ответ, почему именно это происходит
трубопровод.h:
#include lt;iostreamgt; #include lt;vectorgt; namespace G_piplne { class EdtrPipeLine { public: //grabs the file path to the frag file of the glsl shader file EdtrPipeLine(const std::stringamp; vertFilePath, const std::stringamp; fragFilePath); private: //gets the file path of both the frag file and vert file static std::vectorlt;chargt; readFile(const std::stringamp; filepath); //grabs the file path to the vert file of the glsl shader file void createGraphicsPipeLine(const std::stringamp; vertFilePath, const std::stringamp; fragFilePath); }; }
PipeLine.cpp используется для инициализации функций в заголовочном файле конвейера
#include "shaders_h/PipeLine.h" #include lt;fstreamgt; #include lt;stdexceptgt; namespace G_piplne { EdtrPipeLine::EdtrPipeLine(const std::stringamp; vertFilePath, const std::stringamp; fragFilePath) { createGraphicsPipeLine(vertFilePath, fragFilePath); } std::vectorlt;chargt; EdtrPipeLine::readFile(const std::stringamp; filepath) { std::ifstream file(filepath, std::ios::ate | std::ios::binary); if (!file.is_open()) { throw std::runtime_error("failed to open file: " filepath); } size_t filesize = static_castlt;size_tgt;(file.tellg()); std::vectorlt;chargt; buffer(filesize); file.seekg(0); file.read(buffer.data(), filesize); file.close(); return buffer; } void EdtrPipeLine::createGraphicsPipeLine(const std::stringamp; vertFilePath, const std::stringamp; fragFilePath) { //Reads Frag and Vert Code Size auto vertCode = readFile(vertFilePath); auto fragCode = readFile(fragFilePath); //Prints Frag and Vert Code Size std::cout lt;lt; "Vertex Shader Code Size: " lt;lt; vertCode.size() lt;lt; "n"; std::cout lt;lt; "Frag Shader Code Size: " lt;lt; fragCode.size() lt;lt; "n"; } }
and finally, the EditorConfigWindow header file which uses the function to display my vert and frag code size
#pragma once #include "EditorWindow.h" #include "../shaders_h/PipeLine.h" namespace G_editor { class EditorWindowConfig { public: //Init Varibles for the size of the Editor Window static constexpr int WIDTH = 800; static constexpr int HEIGHT = 600; void run(); private: //init Window with name GPRPG EditorWindow editorWindow{ WIDTH, HEIGHT, "GPRPG" }; //Display vert and frag code size G_piplne::EdtrPipeLine edtrPipeLine{"../../Shaders/simpleShader.vert.spv ", "../../Shaders/simpleShader.frag.spv"}; }; }
Все файлы шейдеров находятся в нужном месте и перечислены правильно, я дважды проверил имена, и они также верны, ошибка указана ниже
Необработанное исключение в 0x00007FF8F0154F69 в GPRPG.exe: Исключение Microsoft C : std::ошибка runtime_error в ячейке памяти 0x00000064240FEEA8.
эта ошибка возникает в точке останова прямо при вызове функции createGraphicsPipeLine из файла заголовка EditorWindowConfig, я пытался перемещать файлы шейдеров в проекте, но это приводит к той же проблеме, заранее благодарю вас за любую помощь, которая может указать мне правильное направление для решения этой проблемы
Комментарии:
1. Сбои-это не утечки памяти. Утечка памяти возникает, если вы выделяете память (например
new
, с помощью), но не освобождаете ее (сdelete
помощью ).2. Хорошо… это ошибка, но это не сильно меняет мой вопрос, мне нужна помощь с указанной выше ошибкой.
3. вы пробовали использовать отладчик для перехвата исключения? Или добавление обработчика исключений в ваш код для печати сообщения об исключении? Я почти уверен, что это ваша собственная ошибка во время выполнения, которая возникает.
4. Ваша программа выдает ошибку во время выполнения, если файл не открывается. Убедитесь, что файл существует и у вашей программы есть разрешение на его открытие ( например , он не заблокирован для чтения из-за того, что открыт в каком-либо текстовом редакторе), и если это относительный путь, проверьте, что рабочий каталог является тем, что вы думаете.
5. Вы выдаете ошибку во время выполнения, если не удается открыть файл….
Ответ №1:
В ходе исследования я обнаружил, что добавление абсолютного пути к моему файлу шейдера фактически выводит размер, как и ожидалось, программе по какой-то причине не понравился короткий путь, который я вводил