2012-07-09 5 views
0

메모리 버퍼를 사용하여 파일에 쓰고 있습니다. 각 레코드를 메모리 버퍼로 복사 한 다음 디스크로 플러시합니다.산술 포인터 및 fstream C++

CODE :

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-> 기록 (OutBuffer, 버퍼 크기);" 은 VS 보여줍니다 :

"윈도우 STL_Test2.exe에 중단 점을 트리거하고있다이 때문에 STL_Test2.exe 또는 DLL이 어떤 버그는로드가를 나타내는 힙의 손상에있을 수 있습니다

. .

이 또한있을 수 인해 STL_Test2.exe 포커스가있을 F12를 누르면 사용자에게.

출력 창보다 진단 정보를 가질 수있다. "

나를 도와 줄 사람이 있습니까?

답변

8
OutBuffer = new char(BufferSize); 

이것은 단지 하나 개의 문자에 대한 메모리를 할당하고이 하나 개의 문자는 BufferSizechar 너무 큰 경우 오버 플로우를 일으킬 수있는 BufferSize으로를 초기화합니다.

은 당신이 아마 의미하는 것은 이것이다 :

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

BufferSize 문자에 대한 메모리를 할당합니다. 버퍼는 초기화되지 않습니다.


그것은 당신의 문제와 관련이없는,하지만 당신은 포인터를 선언 할 때 가능하면 메모리를 할당 선호 :

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

는, 할당을 통해 초기화를 선호합니다.

+0

"대괄호 사용 하시겠습니까?" 꺽쇠 괄호는이 '<>'처럼 보입니다. 이'[]'는 대괄호입니다. – anthropomorphic

+1

@MichaelDorst : 죄송합니다. – Nawaz