2010-06-03 2 views
1

는 C++C에 해당 삭제 ++ [] (숯불 *)

delete[] (char *) foo->bar; 

편집의 C 상응하는 무엇입니까

C에 해당할까요?

free(last->key); 
free(last->value); 
free(last) 
+1

malloc을 사용하여 메모리를 할당 한 경우 free를 사용해야합니다. –

+0

@ Sam의 주석 : bar가 실제로 배열 인 경우에 사용했던 calloc에 ​​대해서도 동일합니다. – dkackman

+2

왜 캐스팅을 사용 했습니까? – Clifford

답변

6

C에서는 사용자가 new이 아닙니다. 당신은 방금 malloc()을가집니다; malloc()으로 호출하여 얻은 메모리를 해제하려면 free()이 호출됩니다.

그런데 왜 포인터를 delete으로 전달하기 전에 (char*)으로 전송하겠습니까? 그게 거의 틀림 없습니다 : delete에 전달 된 포인터는 new으로 생성 된 것과 동일한 유형이어야합니다 (또는 클래스 유형이있는 경우에는 가상 소멸자가있는 기본 클래스).

+0

일부 C++ 코드를 ANSI C로 변환 중입니다. (ptr = this-> _property-> next, last = this-> _properties) 에 대해 ptr!= NULL; last = ptr, ptr = ptr-> next) { delete [] last-> key; 삭제 [] (char *) last-> value; 삭제 마지막; \t \t} 여기서 키 값의 typedef 구조체 { 문자 키 *; void * value; struct keyvalue * next; } keyvalue_rec; 하지만 일반 무료 (last-> key); 무료 (last-> value); 무료 (최후); C? – inquam

+0

@inquam :이 포인터는'malloc()'을 사용하여 할당 된 메모리를 가리 킵니까? 그렇다면'free()'를 사용하여 해제하십시오. –

0

deletedelete[]에 해당하는 C는 단지 free입니까?

+2

나는'delete'와'delete []'를 의미한다고 생각합니다. 그렇지 않으면 우리는 다른 C와 C++ 방언을 말할 것입니다 :). – Pieter

+0

@Pieter : 네, 그게 무슨 뜻인가요 :) –

2

그냥 일반 'ol free(). C는 배열과 개별 변수를 구별하지 않습니다.

0

비 배열의 경우와 동일합니다.

free(foo->bar) 
0

등가은 다음과 같습니다

무료 (foo-> 바);

(char *)에 타입 캐스팅 했으므로 'bar'의 실제 유형이 무엇이든간에 캐스팅의 결과로 소멸자가 없었을 것입니다.