2013-12-17 2 views
0
void *mm(void *pTo,void*pOr,size_t s) 
{ 
    assert((pTo)&&(pOr)); 
    char* pt = (char*)pTo; 
    char* po = (char*)pOr; 
    while(s-->0) 
     *pt++ = *po++; 
    return pTo; 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 

    char *p1 = new char; 
    char *p2 = "permutation"; 
    p1 = (char *)mm(p1,p2,4); 
    printf(p1); 
    //delete p1; 
    return 0; 
} 

이상은 내 테스트 프로젝트입니다. 새 char 메모리를 삭제하려면 어떻게해야합니까? 항상 "HEAP CORRUPTION DETECTED 오류가 발생했습니다 ... CRT가 응용 프로그램이 힙 버퍼의 끝 뒤에 메모리에 쓴 것을 감지했습니다". 미리 감사드립니다. C++에서 포인터 및 삭제

+0

최저 :

char *p1 = new char[4];

그런 다음에 의해 삭제합니다. USE std :: vector 동적으로 크기가 조정 된 메모리를 유지합니다. –

답변

3

char *p1 = new char;

하지만 당신은 당신은 메모리에 기록하고 4

while(s-->0) 
     *pt++ = *po++; 

를 작성하려고 당신은 소유하지 않습니다.

해야 할 것 : 심지어 새 전화하거나 삭제하지

delete[] p1;

+0

대단히 감사합니다. – Gent

+0

결과 포인터는 나중에 (printf로) 문자열로 해석되므로, 5 문자 (1 개의 터미네이터가 더 필요함)를 할당하거나 3 자만 복사하고 4 번째를 0 터미네이터로 사용해야합니다. 어떤 경우에도 제로 터미네이터가 필요합니다. – AnT

+0

그리고 그것은'delete [] p1'이 아니라'delete p1 []'입니다. – AnT

0

p1의 "끝에"충분한 바이트를 할당하지 않습니다. 특히 단일 바이트 만 할당하고 4 바이트를 복사합니다. 따라서 할당 된 공간 이상으로 3 바이트를 씁니다.

대신으로 P1 할당 : 당신은 P1 한 새로운 문자 줄

char *p1 = new char[4];