如何在char*func()中正确删除用new[]分配的char数组

How to properly delete the char array allocated with a new[] in a char * func()?

本文关键字:char new 删除 分配 数组 func      更新时间:2023-10-16

此函数将文本文件读取到char缓冲区,并返回指向该缓冲区的指针。

char * textfile_to_char(wchar_t *filename)
{
    WIN32_FIND_DATA data;
    if (FindFirstFile(filename,&data)==INVALID_HANDLE_VALUE)
    {
        wchar_t message[256];
        wsprintf(message,L"File could not be found %lp",filename);
        MessageBox(0,message,0,0);
        return NULL;
    }
    else
    {
        HANDLE hFile=CreateFile(filename,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_ATTRIBUTE_READONLY,0);
        if (hFile==INVALID_HANDLE_VALUE)
        {
            wchar_t message[256];
            wsprintf(message,L"Error opening file: %lp",filename);
            MessageBox(0,message,0,0);
            return NULL;
        }   
        else
        {
            OVERLAPPED overlapped;
            memset(&overlapped,0,sizeof(overlapped));
            char * buffer=new char[data.nFileSizeLow];
            ReadFileEx(hFile,buffer,data.nFileSizeLow,&overlapped,0);
            CloseHandle(hFile);
            buffer[data.nFileSizeLow]=0;
            return buffer;
        }
    }
}

现在,这里还有一段代码,我使用这个函数从这个文本中获取openGl着色器

wchar_t filename[512];
wsprintf(filename,L"%s.vtx",_shader_name);
id_vertex_shader=glCreateShader(GL_VERTEX_SHADER);
id_fragment_shader=glCreateShader(GL_FRAGMENT_SHADER);
char *shader_source=textfile_to_char(filename);
char *buffers[2]={shader_source,0};
glShaderSource(id_vertex_shader,1,buffers,0);
delete[] shader_source;
glCompileShader(id_vertex_shader);

delete[]shadersource实际上让我很困惑,因为a)它不起作用,b)delete shadersource也不起作用。那么我该如何删除它呢?感谢

您进行异步读取,然后期望它立即读取,然后删除文件句柄

添加对GetOverlappedResult的调用readFileEx和CloseHandle:

ReadFileEx(hFile,buffer,data.nFileSizeLow,&overlapped,0);
WORD bytesRead;
if(!GetOverlappedResult(hFile, &overlapped, &bytesRead, TRUE);){
    //check error and such
}
CloseHandle(hFile);
buffer[bytesRead]=0;

或者只使用ReadFile而不使用OVERLAPPED结构:

WORD bytesRead;
ReadFile(hFile,buffer,data.nFileSizeLow,&bytesRead,0);
CloseHandle(hFile);