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 바이트 데이터를 유효한 포인터의 첫 번째 바이트와 일치시킬 수있는 가능성이 너무 큽니다.
무엇이 문제입니까? – piripiri
@piripiri 문제에 대한 해결책을 묻습니다. – wArtist
'22049929'는 어떤면에서 특별합니까? 아니면 아직 정의하지 않았습니까? – undeadherbs