返回值上的 C++ 方法链接不起作用
c++ method chaining on returned value not working
我在很长一段时间后为opengl项目使用cpp。我面临着一个与 cpp 而不是 opengl 相关的问题。下面两个代码片段有什么区别?
// this works
std::string tmp = FileIO::read("vertex_shader");
const char *vertexShaderSource = tmp.c_str();
std::cout<< vertexShaderSource <<std::endl; //shows proper value
//but this doesn't work
const char *vertexShaderSource = FileIO::read("vertex_shader").c_str();
std::cout<< vertexShaderSource <<std::endl; //shows garbage value
//FileIO::read() returns a string value
我有点困惑为什么第一个有效,第二个显示垃圾?我错过了什么吗?
请任何 cpp 专家启发我第二个代码片段有什么问题以及为什么它不起作用。提前感谢,
我想FileIO::read
按值返回,然后FileIO::read("vertex_shader")
返回一个临时std::string
,该将在完整表达式后销毁。之后,vertexShaderSource
变成一个悬空的指针,对它的任何取消引用都会导致 UB。即
const char *vertexShaderSource = FileIO::read("vertex_shader").c_str();
// vertexShaderSource becomes dangled from here
std::cout<< vertexShaderSource <<std::endl; // UB
如果使用命名变量tmp
如第一个代码示例所示,则tmp
在超出定义范围之前不会被销毁;那么代码就可以了。
假设FileIO::read()
按值返回std::string
,那么当你这样做时
FileIO::read("vertex_shader").c_str()
FileIO::read
返回的std::string
对象是临时的。调用其c_str()
函数后,该对象将超出范围并被破坏,从而留下指向不再存在的字符串的指针。
取消引用此指针(在尝试打印字符串时发生)会导致未定义的行为。
您遇到的问题与变量的生存期有关。 FileIO::read
返回一个保存字符串的std::string
。
在第一种情况下,您将返回值复制到变量(实际上由于 RVO,不会进行任何复制),然后您将获得指向字符串的 char 数组的指针。因此,该指针指向的内存由tmp
变量拥有。
在第二种情况下,您将检索指向由 read
函数返回的临时字符串所拥有的 char 数组的指针。这为您提供了一个由临时拥有的内存地址。该语句完成后,临时将连同它拥有的所有内存一起销毁,其中包括您检索并存储在vertexShaderSource
中的指针所指向的 char 数组。
- 你能检查一下为什么在这个代码中从链接列表中删除项目不起作用吗
- C++实用程序::转换在静态链接库中不起作用
- 针对静态库的 G++ 链接不起作用
- 强制链接静态库与 cmake 不起作用
- 链接列表中的所有节点都相同,似乎插入不起作用
- 模板外部链接不起作用
- Opencv 链接 CMAKE 不起作用 Ubuntu 16.04 Docker
- 双链接列表添加元素不起作用,不知何故它总是保持为空
- 与LLVM LLD链接不起作用[MACOS]
- 为什么此代码用于单个链接列表不起作用
- 预制链接链接到共享库不起作用
- 在声明节点创建链接列表时,为什么静态内存分配不起作用
- 返回值上的 C++ 方法链接不起作用
- Boost Logger静态链接:不起作用
- cocos2d android编译时链接不起作用
- 为什么这个链表不起作用?
- c++中的动态链接不起作用
- 链表不起作用(c++)
- g++:静态链接不起作用
- 生成文件链接不起作用(尽管没有错误消息)