我正在使用内存缓冲区写入文件。我将每条记录复制到内存缓冲区,然后将其刷新到磁盘。

码:

    char * OutBuffer;
    char *pt;
    OutBuffer = new char(BufferSize);
    pt = OutBuffer;

    for (int i=0; i<(FileSize / RECORD_SIZE); i++){
        if (((i % recordsPerBlock)==0) && (i>0)){
           FileSortHandle->write(OutBuffer, BufferSize);
           pt = OutBuffer;
        }
        else{
           memcpy(pt, minRecord, RECORD_SIZE);
           pt = pt + RECORD_SIZE;
        }
           minRecord = nullptr;
    }


当我调用“ FileSortHandle-> write(OutBuffer,BufferSize);”时VS显示:

“ Windows已在STL_Test2.exe中触发了一个断点。

这可能是由于堆损坏导致的,这表明STL_Test2.exe或其已加载的任何DLL中存在错误。

这也可能是由于用户在STL_Test2.exe具有焦点时按下了F12。

输出窗口可能包含更多诊断信息。”

有人可以帮助我吗?

最佳答案

OutBuffer = new char(BufferSize);


这仅为一个字符分配内存,并且使用BufferSize初始化该一个字符,如果BufferSize对于char太大,则可能导致溢出。

您可能的意思是:

OutBuffer = new char[BufferSize]; //use square brackets!


它为BufferSize字符分配内存。缓冲区未初始化。



它与您的问题无关,但是,如果可能的话,在声明指针时最好分配内存:

char * OutBuffer = new char [BufferSize];
char *pt = OutBuffer; //prefer initialization over assignment


也就是说,与分配相比,首选初始化。

关于c++ - 算术指针和fstream C++,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11400101/

10-12 03:03