C++ C++;返回字符串的函数在字符串的文本中给出垃圾
因此,我有一个函数返回一个C++ C++;返回字符串的函数在字符串的文本中给出垃圾,c++,C++,因此,我有一个函数返回一个std::string,如下所示: string ReadShaderSource(const char* filename, GLint& shaderSize) // Load the shader source code. { ifstream::pos_type size; string text; ifstream file(filename, ios::in | ios::binary | ios::ate); if
std::string
,如下所示:
string ReadShaderSource(const char* filename, GLint& shaderSize) // Load the shader source code.
{
ifstream::pos_type size;
string text;
ifstream file(filename, ios::in | ios::binary | ios::ate);
if (file.is_open())
{
size = file.tellg();
shaderSize = (GLuint)size;
text.resize(size);
file.seekg(0, ios::beg);
file.read(&text[0], text.size());
file.close();
return text;
}
else
{
SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Fatal Error!",
"Could not load the shader source code from the file.", NULL);
Lunar::Exit();
}
return "";
}
但是当我这样调用函数时:
const char* testStr = ReadShaderSource("test.glsl", size).c_str();
testStr的值包含以下内容:
0x036fdcd8
"îþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîîîîîîîîîîîîîîîîîîî
这没有意义。函数返回正确的值,因此当我在函数中返回文本时,它包含着色器的源代码,但当我返回时
const char* testStr = ReadShaderSource("test.glsl", size).c_str();
testStr
全是垃圾
有什么想法吗
谢谢!Re
“当我做const char*testStr=ReadShaderSource(“test.glsl”,size.)。c_str();
testStr
都是垃圾。”
您正在初始化指向临时字符串
中的缓冲区的指针,该缓冲区在初始化完成时已不存在
相反,对结果变量使用字符串
请注意,函数返回垃圾的结论是没有根据的,它不是根据垃圾的观察得出的,但可能仍然是正确的 您应该使用正确的结果变量类型重新测试以检查这一点。Re “当我做
const char*testStr=ReadShaderSource(“test.glsl”,size.)。c_str();
testStr
都是垃圾。”
您正在初始化指向临时字符串
中的缓冲区的指针,该缓冲区在初始化完成时已不存在
相反,对结果变量使用字符串
请注意,函数返回垃圾的结论是没有根据的,它不是根据垃圾的观察得出的,但可能仍然是正确的 您应该使用正确的结果变量类型重新测试以检查这一点。您需要使用
string str = ReadShaderSource("test.glsl", size);
const char* testStr = str.c_str();
而不是
const char* testStr = ReadShaderSource("test.glsl", size).c_str();
使用第二种形式时,将指针存储在testStr
中,该指针不再有效,因为函数的返回值是一个临时字符串
正如@IInspectable所指出的,您还可以使用常量&
来延长临时对象的生存期
string const& str = ReadShaderSource("test.glsl", size);
const char* testStr = str.c_str();
以下程序表现良好:
#include <iostream>
#include <string>
std::string foo()
{
return "This is a test.";
}
void bar(std::string const& str)
{
std::cout << str.c_str() << std::endl;
}
int main()
{
std::string const& str = foo();
bar(str);
std::cout << str.c_str() << std::endl;
}
#包括
#包括
std::stringfoo()
{
return“这是一个测试。”;
}
空栏(标准::字符串常量和字符串)
{
std::cout您需要使用
string str = ReadShaderSource("test.glsl", size);
const char* testStr = str.c_str();
而不是
const char* testStr = ReadShaderSource("test.glsl", size).c_str();
使用第二种形式时,将指针存储在testStr
中,该指针不再有效,因为函数的返回值是一个临时字符串
正如@IInspectable所指出的,您还可以使用常量&
来延长临时对象的生存期
string const& str = ReadShaderSource("test.glsl", size);
const char* testStr = str.c_str();
以下程序表现良好:
#include <iostream>
#include <string>
std::string foo()
{
return "This is a test.";
}
void bar(std::string const& str)
{
std::cout << str.c_str() << std::endl;
}
int main()
{
std::string const& str = foo();
bar(str);
std::cout << str.c_str() << std::endl;
}
#包括
#包括
std::stringfoo()
{
return“这是一个测试。”;
}
空栏(标准::字符串常量和字符串)
{
std::cout这是因为返回字符串的范围限制在表达式的生存期内。行完成后,返回字符串将被销毁。将返回字符串捕获为const string&testStr=..
函数退出时是否可能从内存中删除string text
?好的,使我得到它。我该怎么做t以便它不会被销毁?参考std::string.cstr()如果不存储函数的结果字符串,则为悬空指针。请复制该字符串或使用常量引用来延长其生存期:这是因为返回字符串的范围仅限于表达式的生存期。行完成后,返回字符串将被销毁。将返回字符串捕获为const string&testStr=..
当函数退出时,是否有可能从内存中删除字符串文本
?好的,使我得到它。我如何做才能使它不被破坏?参考std::string.cstr()如果不存储函数的结果字符串,则为悬空指针。请复制该字符串或使用常量引用来延长其生存期:严格来说,这不是唯一的解决方案。您还可以通过将临时对象绑定到常量左值引用来扩展临时对象的。严格来说,这不是唯一的解决方案。您还可以扩展临时对象的通过将其绑定到const左值引用来实现临时。