2013-08-11 3 views
3

c에서 새 포인터로 이동하지 않고 메모리를 비울 수있는 메소드/함수가 있습니까?C에서 할당 된 메모리를 이동하지 않고 축소 할 수 있습니까?

감사합니다.

+0

표준 C에 없습니다. –

+1

정확히 달성하려는 것은 무엇입니까? 할당 된 메모리의 일부분을 더 이상 필요로하지 않는다면 (그리고 그러한 특정 변수들처럼), 그 변수들을 해제하십시오. – JSQuareD

+0

@JSQuareD : OP가 realloc()이 발생할 수있는 복사본의 오버 헤드를 피하려고한다고 생각합니다. –

답변

3

C99 표준의 엄격한 해석에 따르면 할당 된 블록의 크기를 줄이는 것을 포함하여 realloc()을 호출하면 인수와 다른 포인터가 반환 될 수 있습니다. 실제로 표준의 엄격한 해석에 따르면 이전 포인터를 realloc()에 전달하면 기존 포인터를 모두 불확실하게 렌더링하므로 이전 포인터와 새 포인터를 비교할 수 없습니다.

realloc과 기능은 기존의 객체가 ptr이 가리키는 할당 해제 및 크기가 지정한 크기를 가진 새 개체에 포인터를 반환한다. (C99 7.20.3.4:2는)


하지만, 내 시스템에 realloc()에 대한 매뉴얼 페이지 말한다 : 메모리 할당이 가리키는 확대 에 충분한 공간이없는 경우

ptr에 의해 realloc()은 새로운 할당을 만들고 ptr이 가리키는 이전 데이터를 복사하여 에 맞게 할당하고 이전 할당을 해제 한 다음 할당 된 메모리 인 에 대한 포인터를 반환합니다.

이 더 많거나 적은 블록을 확대하기 realloc을 사용하는 경우는()는 새로운 데이터를 포인터를 이동하고 반환 할 수 있다는 것을 의미한다. 이것은이 플랫폼에서 realloc()을 사용하여 malloc()에서 얻은 블록의 크기를 줄이면 이동의 위험이 없음을 의미합니다.

나는 그것을 이동하지 않고 할당 된 블록의 크기를 줄일 수 realloc()을 사용했다면, 나는 아래의 체크 사용합니다 :

uintptr_t save = old; 
void * new = realloc(old, …); 
assert (save == (uintptr_t) new); 

주의 사항은 아무것도하지를 인스턴스 우승자 # 2에 대한 참조 this informal undefined behavior competition.

+0

내가 추가 할 수있는 유일한 점은 포인터를 비교하는 것이 얼마나 무의미한 것인지입니다. 'realloc'이'NULL'을 반환하면 이전 포인터는 변경되지 않습니다. 그렇지 않으면 새 포인터가 사용되어야합니다.할당은 분기 및 가능한 할당보다 빠르기 때문에 새 포인터가 'NULL'이 아닌지 확인한 후 이전 포인터에 새 포인터를 할당하십시오. NULL 인 경우 데이터는 이전 포인터에 남아 있으므로 크기가 조정되지 않았지만 안전하게 액세스 할 수 있습니다. 그러한 조건 하에서 당신이하는 일은 재배치의 배경과 의도에 달려 있습니다. –

+0

@ChronoKitsune if (new! = old) {오래된 포인터의 값 비싼 수많은 복사본}은 때로는 기존 코드에서 볼 수있는 관용구입니다. 나는 그 가치에 대한 입장을 취하지 않고 있으며, 단지 그것이 존재하고 기술적으로 정의되지 않은 행동이라고 말하고있다. –

+0

어딘가에서 동일한 주소를 가리키는 또 다른 변수가 있으면 realloc 후 작업이됩니다. 어쨌든 무효가되기 때문에 맹목적으로 모든 포인터를 새 포인터에 할당합니다. 할당 작업을 수행하는 데 비용이 많이 듭니다. 그것이 그렇다면, 나는 그러한 업데이트를 피할 수있는 경우 간접적 인 수준을 한 가지 더 선호한다고 주장 할 것입니다. 그런 식으로 이전 포인터에 새 포인터를 할당하면 이전 포인터가 가리킨 동일한 주소가 아니라 이전 포인터의 주소를 가리 키기 때문에 다른 복사본을 업데이트합니다. –

0

나는 새로운 위치로 복사 한 다음 free()를 사용하여 이전 위치를 해제해야하기 때문에 아니오.

이것은 내가 당신에게 질문하는 것으로 이해합니다.

@JsQuareD도 귀하의 질문에서 이해하는 것이 무엇인지 이해하십시오.