c++ - c++ - 在类内或类外访问时相同变量的 cout 但不同的输出
问题描述
我正在构建一个简单的Shader
类。Shader
类有一个const char* _src
成员变量,并在构造函数中加载。
然而,输出
std::cout << _src << std::endl; // access within class
和
std::cout << fs._src << std::endl; // access out of class,fs is a Shader instance
完全不同。虽然第一个给出了正确的结果,但后者输出了一些无意义的字符:
输出 1
#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aColor;
out vec3 color;
void main() {
gl_Position = vec4(aPos, 1.0);
color = aColor;
}
输出 2
αG╬▀
Shader.h
class Shader {
public:
const char *_src;
GLuint _type;
Shader(const char *fn, GLuint type);
private:
bool loadSource(const char *fn);
};
Shader.cpp
#include "Shader.h"
#include <fstream>
#include <string>
#include <iostream>
Shader::Shader(const char *fn, GLuint type)
: _type(type) {
loadSource(fn);
}
bool Shader::loadSource(const char *fn) {
std::ifstream file(fn);
if (!file.good())
return false;
std::string line, src;
while (std::getline(file, line)) {
src += line + '\n';
}
_src = src.c_str();
std::cout << _src << std::endl;
file.close();
return true;
}
main.cpp
int main() {
Shader fs("vertex_shader.glsl", GL_VERTEX_SHADER);
std::cout << fs._src << std::endl;
}
两人cout
出现在main()
和中Shader::loadSource()
。
vertex_shader.glsl
#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aColor;
out vec3 color;
void main() {
gl_Position = vec4(aPos, 1.0);
color = aColor;
}
怎么了??
解决方案
“泄露”本地地址的经典例子:
_src = src.c_str();
. 一旦调用结束,它就会src
连同指向的所有东西一起被销毁。_src
loadSource
您需要对 进行适当的复制_src
,或者直接使用 std::string 来避免此类错误。
推荐阅读
- kubernetes - 列出正在为服务提供服务的 pod
- karate - 空手道:如何在空手道中初始化 RemoteWebDriver
- python - 用神经网络识别钞票,我必须裁剪数据集的图像吗
- javascript - 当我的 Angular 库项目使用“--prod”选项启动时,扩展内置类的方法(通过 JS 的“.prototype”属性)不起作用
- javascript - 首先通过节点后端传递所有http请求和React Routes进行会话验证,然后返回路径
- c - 为什么C不能直接分配数组,但可以在结构中分配数组?
- android - LiveData 完成加载时触发代码?
- angular - 如何将对象转换为对象数组?在角
- ios - Xcode 中的签名配置文件冲突
- wordpress-theming - 函数.php 文件