코드에 무슨 문제가 있습니까? 그것이되어야합니다. 오류가 발생하고 있습니다. 연산자 'delete', void * argument에 적용됩니다.삭제 연산자를 사용하여 void 포인터 삭제
int i;
void *ptr = &i;
delete ptr;
코드에 무슨 문제가 있습니까? 그것이되어야합니다. 오류가 발생하고 있습니다. 연산자 'delete', void * argument에 적용됩니다.삭제 연산자를 사용하여 void 포인터 삭제
int i;
void *ptr = &i;
delete ptr;
사실 아주 코드가 잘못되었습니다.
void* ptr = &i
을 사용하십시오. 컴파일러는 코드를 내보내는 데 매우 관대합니다.new
은 컴파일러가 모든 sizeof
데이터가 손실되는대로 경우 패스 void*
을 삭제하는 방법을 많은 메모리 모르는delete
일 에드했습니다 수 있습니다.코드에 무슨 문제가 있습니까?
는
모든 int i;
제외하고 두 번째 줄은 포인터에 정수로 변환하려고합니다. 특수한 상황에서는 컴파일러 이후에 reinterpret_cast
으로 강제 할 수 있습니다. 정수가 어떻게 든 유효한 포인터 값을 포함하면 프로그램은 올바르게 동작합니다. UPDATE : 이제는 i
주소를 사용하도록 질문이 수정되었으므로이 줄은 더 이상 잘못되었습니다.
세 번째 줄은 잘못된 포인터 유형을 사용하여 잘못된 메모리를 삭제하려고 시도합니다.
.
다른 것. 당신이하고 싶은 것을 모른 채 말하기 란 불가능합니다. 아마 당신이 원하는 :
int i;
void * ptr = &i; // Points to `i`, losing type information.
운영자
delete
는void*
인수에 적용.
항상 잘못되었습니다. 이전에 new
으로 할당 한 객체 만 delete
이어야합니다. 포인터는 올바른 유형이어야합니다.
(또는 기본 클래스에, 그것은 가상 소멸자와 클래스 타입 인 경우) 그래서
올바른 것 다음; 하지만 무의미한 당신은 동적 할당을위한 좋은 이유가없는 :
int * ptr = new int;
delete ptr;
그리고 당신은 메모리 누수 및 런타임 오류에 대한 강력한해야 코드를 작성하는 경우 물론, 당신은 RAII 유형을 사용하여 모든 동적 메모리를 관리한다 컨테이너 및 스마트 포인터로. 동적 객체에 필요한 경우에 따라서, 당신은 수행해야합니다
std::unique_ptr<int> ptr(new int);
당신이 현재 범위의 끝 부분을 삭제하거나 다른 영역으로 이동하려는 경우, 또는
auto ptr = std::make_shared<int>();
두 개 이상의 범위에서 소유권을 공유하려는 경우 두 경우 모두 포인터가 끝나면 자동으로 개체가 삭제됩니다.
http://stackoverflow.com/questions/941832/is-it-safe-to-delete-a-void-pointer – spiritwolfform
'throw'는 보통 런타임 컨텍스트에서 사용됩니다. 당신은 당신의 코드에 에러를보고하는 컴파일러에 대해 이야기하고 있습니다. –
@ PeterWood : 위의 코드는 아마 잘 컴파일됩니다. –