Я пытаюсь добавить две переменные LPCWSTR, как в
Shader = L"shader.fx"Path = L"Source/Shaders/"return Path + Shader
Я пробовал тысячу разных способов, но мой последний был такой
LPCWSTR ShaderFile = GetShader(L"shader.fx");
....
LPCWSTR GetShader(std::wstring _Shader)
{
std::wstring ShaderPath = static_cast<std::wstring>(SHADER_DIRECTORY) + _Shader;
LPCWSTR Return = ShaderPath.c_str();
return Return;
}
Теперь, когда я ставлю точку останова на возврат, значение кажется хорошим, return = Source / Shaders / shader.fx, как и ожидалось. Но когда я возвращаю F10 обратно в свой объект, переменная ShaderFile оказывается чем-то совершенно случайным, набором, напоминающим арабские символы.
Может ли кто-нибудь указать мне правильное направление, что делать? Как я уже сказал, функция, кажется, работает нормально, просто когда я F10 через точку останова обратно в мой проект, переменная равна совершенно другому
Происходит то, что вы возвращаете адрес для данных, которые возвращаются недействительными в результате возврата, так что все будет выглядеть хорошо до того, как функция вернется, но сразу после результата это все (по крайней мере, потенциально) мусор.
Если это вообще возможно, просто верните std::wstring
и где-то в коде вызова вызвать его c_str()
Функция-член, когда вам действительно это нужно в виде необработанного буфера.
Если вы не можете сделать это, и просто должен вернуть результат в сыром виде LPCWSTR
тогда вам, вероятно, придется динамически распределять пространство:
LPCWSTR *ret = new char [ShaderPath.size()];
strcpy(ret, ShaderPath.c_str());
return ret;
Затем код вызова должен delete []
память, когда она больше не нужна.
Вы действительно хочу избежать последнего, и просто вернуть std::wstring
хоть. Это намного проще и чище, и избавит от почти неизбежных проблем либо с удалением буфера до того, как вы закончили его использовать, либо забыв удалить его, когда вы закончите с ним (все еще серьезные проблемы в C, но по сути неслыханные в Прилично написано C ++).
wstring.c_str()
возвращает внутренний указатель строки.
В вашем случае локальная переменная уничтожается при выходе из функции, и, следовательно, возвращаемый указатель освобождается, и вы получаете неожиданный результат.
Возможным решением было бы скопировать строку, используя метод wcscpy()
Проблема в том, что c_str()
метод возвращает указатель на локальную переменную ShaderPath
в памяти. Когда функция выходит, ShaderPath
уничтожается вместе с данными, указанными вашим LPCWSTR
,
Почему бы вам просто не сохранить переменную как wstring
и всякий раз, когда вам нужно LPCWSTR
ты можешь позвонить c_str()
?
std::wstring GetShader(std::wstring _Shader)
{
return static_cast<std::wstring>(SHADER_DIRECTORY) + _Shader;
}
Предполагая, что у вас была функция Foo(LPCWSTR path)
, вы бы использовали это как:
Foo(GetShader(L"shader.fx").c_str());
или же
std::wstring ShaderFile = GetShader(L"shader.fx");
Foo(ShaderFile.c_str());