2017-11-28 7 views
-4
bool isPointerValid(void *vd) 
{ 
    if (*(int*)vd == 22049929) 
    { 
     return false; 
    } 

    return true; 
} 

void operator delete(void *vd) 
{ 
    if (!isPointerValid(vd)) 
    { 
     //DOUBLE DELETION 
     throw; 
    } 

    realloc(vd, 4); 
    *((int*)vd) = 22049929; 
} 

전적으로 데이터를 해제하는 대신 데이터를 재 할당하고 있습니다. 그리고 재 할당 된 데이터에 특정 정수 값을 씁니다. 그렇게하면 처음 4 바이트를보고 삭제 된 포인터를 검사 할 수 있습니다.데이터의 일부를 비우고 나머지를 특정 정수 값으로 표시하여 포인터가 유효하지 않음을 나타냅니다. (배열 아님)

메모리를 절약하기 위해 크기를 줄이는 작업을하고 있습니다.

하지만, 여기에 두 가지 문제가 있습니다

1 realloc을 기능을 사용하면 재 할당 한 후 동일한 위치를 가지고가는 것을 guarenteeing되지는. 해당 위치의 메모리에 4 바이트의 충분한 공간이 있어도. 초기 데이터가 4 바이트보다 큰 경우 충분한 공간이 있어야합니다.

2- 일부 데이터 유형은 4 바이트보다 작을 수 있습니다. 그리고 그 위치에서 메모리에 4 바이트를위한 충분한 공간이 없을 수 있습니다. 이러한 작은 데이터 형식을 컨테이너에 저장할 때 종종 발생합니다. 우리는 모든 데이터 유형을 1 바이트로 재 할당하여이를 해결할 수 있지만 1 바이트 데이터를 유효한 포인터의 첫 번째 바이트와 일치시킬 수있는 가능성이 너무 큽니다.

+0

무엇이 문제입니까? – piripiri

+0

@piripiri 문제에 대한 해결책을 묻습니다. – wArtist

+0

'22049929'는 어떤면에서 특별합니까? 아니면 아직 정의하지 않았습니까? – undeadherbs

답변

0

최고의 감시 가치는 (void*) nullptr입니다. 당신 자신의 센티널을 발명하는 것은 문제를 요구하고 있습니다.