2013-05-29 4 views
-4

코드에 무슨 문제가 있습니까? 그것이되어야합니다. 오류가 발생하고 있습니다. 연산자 'delete', void * argument에 적용됩니다.삭제 연산자를 사용하여 void 포인터 삭제

int i; 
void *ptr = &i; 

delete ptr; 
+0

http://stackoverflow.com/questions/941832/is-it-safe-to-delete-a-void-pointer – spiritwolfform

+0

'throw'는 보통 런타임 컨텍스트에서 사용됩니다. 당신은 당신의 코드에 에러를보고하는 컴파일러에 대해 이야기하고 있습니다. –

+0

@ PeterWood : 위의 코드는 아마 잘 컴파일됩니다. –

답변

0

동적으로 할당되지 않은 항목을 삭제하려고하므로 코드가 작동하지 않습니다.
어쨌든 void 포인터를 삭제하는 것은 정의되어 있지 않습니다. 자세한 내용은 this Q&A을 참조하십시오.

+0

당신이 언급 한 링크가 내 질문에 답하지 않습니다. int * i = 새로운 int; void * ptr = i; 삭제 ptr; 괜찮습니까? – Anand

+0

@Anand 질문에 대한 답변을 제공합니다. 두 번째 대답을보십시오. – Gorpik

1

사실 아주 코드가 잘못되었습니다.

  1. 당신은 i의 주소를 취하지 않습니다. 대신 void* ptr = &i 을 사용하십시오. 컴파일러는 코드를 내보내는 데 매우 관대합니다.
  2. 스택에서 삭제 중입니다. 안좋다. 당신은 당신이 new은 컴파일러가 모든 sizeof 데이터가 손실되는대로 경우 패스 void*을 삭제하는 방법을 많은 메모리 모르는
  3. delete 일 에드했습니다 수 있습니다.
2

새로 할당 한 것만 삭제해야합니다.

+0

절대적으로 사실이지만 오류 메시지의 원인은 아닙니다. – Gorpik

+0

네, void 타입의 포인터를 new로 할당 할 수 없으므로 '삭제'할 수도 없습니다. – QI3it

+0

가능합니다. 그 코드를'int * i = new int; void * ptr = i;'. 'ptr'는 이제'new'로 생성 된 객체를 가리 킵니다 만, 그 타입 때문에 삭제할 수 없습니다. – Gorpik

7

코드에 무슨 문제가 있습니까?

모든 int i;

제외하고 두 번째 줄은 포인터에 정수로 변환하려고합니다. 특수한 상황에서는 컴파일러 이후에 reinterpret_cast으로 강제 할 수 있습니다. 정수가 어떻게 든 유효한 포인터 값을 포함하면 프로그램은 올바르게 동작합니다. UPDATE : 이제는 i 주소를 사용하도록 질문이 수정되었으므로이 줄은 더 이상 잘못되었습니다.

세 번째 줄은 잘못된 포인터 유형을 사용하여 잘못된 메모리를 삭제하려고 시도합니다.

.

다른 것. 당신이하고 싶은 것을 모른 채 말하기 란 불가능합니다. 아마 당신이 원하는 :

int i; 
void * ptr = &i; // Points to `i`, losing type information. 

운영자 deletevoid* 인수에 적용.

항상 잘못되었습니다. 이전에 new으로 할당 한 객체 만 delete이어야합니다. 포인터는 올바른 유형이어야합니다.

(또는 기본 클래스에, 그것은 가상 소멸자와 클래스 타입 인 경우) 그래서

올바른 것 다음; 하지만 무의미한 당신은 동적 할당을위한 좋은 이유가없는 :

int * ptr = new int; 
delete ptr; 

그리고 당신은 메모리 누수 및 런타임 오류에 대한 강력한해야 코드를 작성하는 경우 물론, 당신은 RAII 유형을 사용하여 모든 동적 메모리를 관리한다 컨테이너 및 스마트 포인터로. 동적 객체에 필요한 경우에 따라서, 당신은 수행해야합니다

std::unique_ptr<int> ptr(new int); 

당신이 현재 범위의 끝 부분을 삭제하거나 다른 영역으로 이동하려는 경우, 또는

auto ptr = std::make_shared<int>(); 

두 개 이상의 범위에서 소유권을 공유하려는 경우 두 경우 모두 포인터가 끝나면 자동으로 개체가 삭제됩니다.

+0

int * i = 새로운 int; void * ptr = i; ptr을 삭제하십시오; 이거 괜찮아 ? – Anand

+1

@Anand : 아니요, 'int'를 삭제하려면'int * '를 사용해야하기 때문입니다. 올바른 타입 정보가 없으면'delete'는 정의되지 않은 동작을합니다. –

+0

그러면이 경우 ptr을 삭제하는 방법은 무엇입니까? – Anand