2014-11-30 3 views
-2

나는 delete가 항상 new 연산자와 함께 사용되어야한다는 것을 알고있다. 그리고 다음 코드로 세그멘테이션 오류가 발생합니다. 그러나 이것에 대한 이유는 무엇입니까.새 기능을 사용하지 않고 삭제 기능을 사용할 수없는 이유는 무엇입니까?

#include<iostream> 
    using namespace std; 
    class A 
    { 
     public: 
      void fun() 
      { 
       delete this; 
      } 
    }; 

    int main() 
    { 

     A a; 
     a.fun(); 


     return 0; 
    } 
+2

어떻게 더 메모리가 새에 의해 할당하지 않았다 것을 삭제할 수 있습니다? – Leeor

+5

'나는 항상 새로운 연산자를 사용하여 삭제해야한다는 것을 알고 있습니다. '사실 당신은 이것을 알지 못합니다. – user93353

+1

스택에 할당 된 메모리를'삭제 '하려고하고 세그먼트 오류가 발생합니다. – Ares

답변

1

삭제와 함께 사용해야합니다. 왜요?

어떤 개체에 new 연산자가 적용되면 (상세하게 이동할 필요가없는) compiler do some internal book-keeping이 삭제 될 때 해당 메모리를 적절하게 할당 해제 할 수 있습니다. 소멸자가 객체 which are fully constructed에서만 호출된다고 들었을 것입니다. not-fully-constructed objects is efficiency에서 소멸자가 호출되지 않도록하는 한 가지 이유. 소멸자가 허용되면 여분의 장부 보관을 유지해야 삭제가 객체의 얼마나 많은 비트가 많은 메모리 만 삭제할 수 있는지 알 수 있습니다.

이제 상위 레벨은 어떻게됩니까? 새로운 사용하는 경우

두 가지 일이 : -

1) adequate amount of memory is allocated. 
2) Then constructors are called to initialize object in that memory. 

두 개의 다른 것들을 삭제 사용

일 : - 당신은 단지 컴파일러 수있는 방법을 삭제 사용하는 경우

1) destructors are called for the objects in memory. 
2) memory is de-allocated then. 

다음 적절한 작업을 수행합니다. 객체가 스택에 할당 된 경우

, 당신의 컴파일러는 그 범위의 끝에서 소멸자에 대한 호출을 생성하는 것입니다 : -

스택 개체에 대한 삭제 사용. 즉, 소멸자를 두 번 호출합니다.

소멸자를 두 번 호출하는 것 외에 할당되지 않은 메모리의 할당을 해제하려고 시도합니다.

+0

** - 1 ** 효율성에 대한 설명이 잘못되어 오도하는 것입니다. –

+0

@ Cheersandhth.-Alf 여러분의 의견을 환영합니다. 하지만 그 대답을 오도하는 것은 누군가에게 도움이되지 않을 것이라고 말하고 있습니다. 설명을 해줄 수 있다면 스택 오버 플로우 커뮤니티에 많은 도움이 될 것입니다. 그 외에는 뭔가 배울 것입니다. – ravi

+1

이전에 (제거 된 설명에서) 당신은 Herb Sutter가 쓴 단락의 일부를 인용했습니다. C++이 완벽하게 구축되지 않은 객체에 대해 소멸자를 호출하는 것을 거부하는 이유가 있으며, 단순히 당신의 삶을 어렵게 만드는 것이 아닙니다. 왜냐하면 많은 경우에 무의미한 것 - 아마도 해로운 것 -을 할 수 있습니다. " 구성되지 않은 하위 오브젝트는 불확정 값을 가질 수 있고 일반적으로 유효한 클래스 불변성을 가지지 않기 때문에 무의미하고 유해합니다. 그러한 청소는 의미가 없으며 불가능합니다. –

1

스택에서 삭제하려고하기 때문에.

게다가 delete this을 사용하면 안됩니다 (VERY 드문 경우 제외).

deletenew (또는 nullpointers)에서 얻은 포인터를 사용해야하는 이유는 당신이 new T[], 즉 원칙으로 얻은 포인터에 대한 delete[]를 사용해야하는 이유와 동일하다
4

이 C++에서

        사용하지 않는 것에 대해서는 비용을 지불하지 않습니다.

일반적으로.

delete

단지 주어진 포인터 인수는 이전 new에 의해 제작되었다 여부를 확인, 인수로 임의의 포인터를 지원, 만 아무것도 그 경우의 수 있었다. 그러나 일반적으로 비효율적입니다. 대부분의 C++ 프로그래머는 필요하지 않고 사용하지 않지만 여전히 비용을 지불해야하는 서비스입니다.

0

INT 주() {

A a=new A(); 
    a.fun(); 


    return 0; 
} 
+2

답변을 설명해주세요.이 답변에는 교육적인 가치가 없습니다. – Lrrr

관련 문제