记一个glDeleteShader不恰当使用导致的bug

shaderProgram类构造函数如下

shaderProgram::shaderProgram(std::initializer_list init_list) : shaderList()
{
    printf("start\n");
    for (shader tempshader : init_list)
    {
        if (glIsShader(tempshader.getShaderId()))
        {
            printf("%s:%d OK start\n", tempshader.getPath().c_str(), tempshader.getShaderId());
        }
    }

    printf("middle\n");

    for (shader tempshader : init_list)
    {
        printf("middle start : %s , %d\n", tempshader.getPath().c_str(), tempshader.getShaderId());
        if (glIsShader(tempshader.getShaderId()))
        {
            printf("%s:%d OK start11\n", tempshader.getPath().c_str(), tempshader.getShaderId());
        }
    }


    printf("end\n");
    for (shader tempshader : init_list)
    {
        printf("end start : %s , %d\n", tempshader.getPath().c_str(), tempshader.getShaderId());
        if (glIsShader(tempshader.getShaderId()))
        {
            printf("%s:%d OK end\n", tempshader.getPath().c_str(), tempshader.getShaderId());
        }
    }
    shaderList.reserve(init_list.size() + 10);
    for (shader tempshader : init_list)
    {
        shaderList.push_back(tempshader);
    }
    link_enable = true;
}

运行情况:

shaderProgram generate start
start
shadersource\vertexsource\vertex1.vs:1 OK start
shadersource\fragmentsource\fragment1.fs:2 OK start
middle
middle start : shadersource\vertexsource\vertex1.vs , 1
middle start : shadersource\fragmentsource\fragment1.fs , 2
end
end start : shadersource\vertexsource\vertex1.vs , 1
end start : shadersource\fragmentsource\fragment1.fs , 2
shaderProgram generate end

同样的glIsShader语句同时执行三次出现有两次没有被执行
glIsShader能够返回true的shader为通过glCreateShader创建,同时没有被执行glDeleteShader的shader,这三个foreach中使用的tempshader会产生一个临时对象,这个对象在结束一次循环的时候会被销毁,会调用析构函数
同时shader类的析构函数是这样写的

shader::~shader()
{
    if (glIsShader(shaderId))
        glDeleteShader(shaderId);
}

foreach的临时对象销毁时调用了析构,导致我的shader被glDeleteShader了,所以后面的无法被执行

你可能感兴趣的:(记一个glDeleteShader不恰当使用导致的bug)