2014-02-15 2 views
0

C에서 free()은 메모리를 해제하는 데 사용됩니다 (예 : free(ptr)). 내가 알고 있듯이 블록 크기 정보를 저장하기 위해 라이브러리 코드에서 ptr 전에 여분의 메모리가 할당됩니다. free()이 호출 된 후 전체 블록이 추적 된 다음 해제됩니다.C++의 논리 삭제 및 삭제 []

C++에는 두 가지 형식의 new와 delete가 있습니다. 하나는 배열을위한 것입니다. new[]을 사용하는 경우 delete[]을 사용해야합니다. 예 :

int ptr = new [10]; 
delete [] ptr; 

질문 1 : 여기 delete ptr을 사용할 수 있습니까? 그래도 괜찮 으면 delete ptr + 2?

질문 2 : new[]과 일치하도록 delete[]을 사용해야하는 경우 왜 두 가지 형태의 삭제가 필요합니까? 한 양식 (예 : delete)이면 충분합니다.

모든 제안 주셔서 감사합니다!

감사합니다. Mgetz. 질문 2 : 왜 C++ 표준은 어떤 상황에서 하나의 올바른 양식 만 있으면 삭제 []와 삭제를 제안 했습니까?

+0

마음을 열고 http://www.parashift.com/c++-faq/freestore-mgmt.html – lsalamon

+0

이것은 C++의 먼지가 많은 부분 중 하나입니다. 전염병처럼 새로운 []을 피하고 []를 삭제하십시오. – epx

답변

2

Q1 : 당신은 delete를 사용할 수 있지만 그것은 잘못된 것입니다.

이것은 대개 할당 된 메모리를 올바르게 비우는 한 "작동"하지만 소멸자를 제대로 호출하지 않습니다. 사소한 유형의 경우, 종종 차이점을 볼 수는 없지만 그것이 어쨌든 잘못되지 않았다는 것을 의미하지는 않습니다. 어쨌든 그것은 정의되지 않은 동작이므로 가능하다면 UB를 호출하면 코드가 작동한다는 보장을 잃어 버릴 수 있습니다. 물론 작동 할 수는 있지만 결코 100 % 확신 할 수는 없습니다.
ptr+2을 삭제해도 정의되지 않은 동작이며 거의 작동하지 않을 것입니다. 일반적으로 이것은 단순히 프로그램 충돌을 초래합니다.

질문 2 : 다른 것들을 의미하기 때문에 두 개가 필요합니다. 하나는 "이 포인터를 단일 객체에 대한 포인터를 삭제하는"것을 의미하고 다른 하나는 "이 포인터와 객체의 포인터를 삭제"를 의미합니다.
컴파일러는 분명히 다른 여러 가지 코드를 생성해야합니다.

+0

포인트 1의 경우, glibc는 할당/할당 해제 짝이 맞지 않았거나 환경의 MALLOC_CHECK_ 값에 따라 런타임에 프로그램을 중단 할 수 있음을 알려줍니다. 그것은 눈에 띄는 차이입니다. – SirGuy

+0

@GuyGreer : 내 버전은 보이지 않습니다 (제대로 소멸자를 호출하지 않는 경우를 제외하고는 정상적으로 작동하는 것 같습니다). 그러나 빌드가 경고 또는 중단 된 경우에도 훌륭합니다. 나는 오류를 숨기는 "작업 어쨌든"동작 대신 중단 또는 하드 충돌을 매우 선호합니다. 하드 및 초기 시행을 중단하고 적절한 코드를 작성합니다. – Damon

0

mallocfree과 달리 newdelete은 메모리를 할당하고 할당을 해제하는 것 외에도 두 가지 형식이 필요합니다. 그들은 또한 각각 객체를 생성하고 소멸시킨다.

newdelete은 스칼라 개체를 다루는 반면, new[] 및 은 개체 배열을 처리합니다.

당신이 new T[n] 전화

, 그것은 Tn 사본에 대한 충분한 메모리를 할당하고 할당 된 메모리 내에서 n 인스턴스를 만들 수 있습니다. 마찬가지로 delete[]을 호출하면 해당 n 인스턴스가 삭제되고 할당이 해제됩니다. 정보가 구현 어딘가 멀리 은닉되고 있지만, 표준 대신 delete를 호출하는 경우 모든 n 오브젝트를 파괴하는 구현을 필요로하지 않는다는 것을 분명히

, 당신은 delete[]n 합격을하지 못하기 때문이다.구현은 첫 번째 객체를 파괴 할 수 있으며 올바르게 동작하고 모든 n 객체를 파괴하거나 demons to fly out of your nose을 초래할 수 있습니다. 간단히 말해

, 그것은 정의되지 않은 동작의 일어날 것이다 무슨 말에는 거기, 당신이 그것을 피할 가장 필수적 없습니다.