首页 > 解决方案 > 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;
}

怎么了??

标签: c++

解决方案


“泄露”本地地址的经典例子: _src = src.c_str();. 一旦调用结束,它就会src连同指向的所有东西一起被销毁。_srcloadSource

您需要对 进行适当的复制_src,或者直接使用 std::string 来避免此类错误。


推荐阅读