Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;返回字符串的函数在字符串的文本中给出垃圾_C++ - Fatal编程技术网

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左值引用来实现临时。