2

次のアプリは nullpointer でクラッシュします。どうしたものかと悩んでいます...

#include "stdio.h"
#include "string.h"

char* getFileData(char* fileName);
bool createShader( int shaderType, const char* shader, const char* shaderFile ) ;
void glShaderSource(int shader, int count, const char** string, const int* length);

int main(int argc, char* argv[])
{
    char* shader = getFileData("filea.csd");
    bool success = createShader(1, shader, "filea.csd");
    return 0;
}

char* getFileData(char* fileName) {
    if(!strcmp(fileName, "filea.csd"))
        return "this is the content of the file a\0";
    else if(!strcmp(fileName, "fileb.csd"))
        return "this is the content of the file b\0";
    else if(!strcmp(fileName, "filec.csd"))
        return "this is the content of the file c\0";
    else 
        return "";
}

bool createShader( int shaderType, const char* shader, const char* shaderFile ) 
{
    int shaderHandle = 122;

    glShaderSource( shaderHandle, 1, &shader, NULL ); ////This line is where it crashes.
    return true;
}

void glShaderSource(int shader, int count, const char** string, const int* length) {
}
4

3 に答える 3

1

Pointer が NULL なので、double ポインタを渡してみてください。フォームの何か

bool createShader( GLenum shaderType, const char** shader, const char* shaderFile )//<-- change 
{
    GLuint shaderHandle = glCreateShader( shaderType );

    glShaderSource( shaderHandle, 1, shader, NULL ); //<--change
    glCompileShader( shaderHandle );

    int status = 0;

    glGetShaderiv( shaderHandle, GL_COMPILE_STATUS, &status );
}

void main () {
      char* shader = strdup(getFileData("filea.csd"));
      bool success = createShader(shaderType, &shader, "filea.csd"); //<--change
      delete shader;
      return success;
}
于 2012-06-04T03:30:13.193 に答える
1

glCreateShader からの戻り値を確認するのは良いことだと思います。ゼロでないことを確認してください。

この線

delete shader

も間違っています。freeそこではクラッシュしないかもしれませんが、malloc によって割り当てられたメモリを解放するために使用する必要があります。

于 2012-06-04T03:22:08.413 に答える
0

私が見たバグの1つは次の行です。

    delete shader;

その行は、shader が指すメモリが new 演算子で割り当てられた場合にのみ正しく機能します。しかし、getFileData() メソッドを見ると、返される文字配列は new によって割り当てられたものではなく、静的データであることがわかります。

したがって、修正は getFileData() が new 演算子によって割り当てられた文字配列を返すようにするか、さらに良いことに std::string を返すことです。文字列の処理に動的に割り当てられた文字配列を使用すると、エラーが発生しやすくなるため、お勧めできません。

于 2012-06-04T04:17:16.843 に答える