2009-04-16 12 views
72

const 포인터에 관한 기본적인 질문이 있습니다. const 포인터를 사용하여 non-const 멤버 함수를 호출 할 수 없습니다. 그러나, 나는이 가리키는 const 포인터에이 작업을 수행 할 수 있습니까 : const (T const *)에 대한 포인터 삭제

delete p; 

은 본질에 const가 아닌 '방법'인 클래스의 소멸자를 호출합니다. 왜 이것이 허용됩니까? 다음을 지원하는 것일뿐입니다.

delete this; 

또는 다른 이유가 있습니까?

// dynamically create object that cannot be changed 
const Foo * f = new Foo; 

// use const member functions here 

// delete it 
delete f; 

을하지만 문제는 동적으로 생성하는 개체에 한정되지 않고 :

{ 
const Foo f; 
// use it 
} // destructor called here 

소멸자 const를 개체를 호출 할 수없는 경우 우리가 사용할 수 CONST 객체를

답변

90

그것은 지원의 조금도.

+17

+1 최근 수정 사항입니다. 나는 이것이 진정한 이유라고 생각한다. const 객체에 대한 자동 소멸자 호출 - delete f와 거의 같습니다. 여기서 f - const의 포인터. – bayda

37

이렇게하면 이 아닌 경우 const_cast를 사용하지 않고 const 개체를 삭제할 수 없습니다.

의미 상, const는 객체가 변경 불가능하다는 표시입니다. 그러나 그것이 객체를 삭제해서는 안된다는 것을 의미하지는 않습니다.

+0

소멸자는 다소 폭력적인 방식으로 객체를 변형 할 수 있습니다. 따라서 이전에 인식하지 못했던 '불변'이라는 단어를 이상하게 사용해야합니다. – DarthGizka

5

생성자와 소멸자는 '방법'으로 볼 수 없습니다. 그것들은 클래스의 객체를 초기화하고 해체하는 특별한 구조입니다.

'const 포인터'는 살아있는 동안 조작이 수행 될 때 오브젝트의 상태가 변경되지 않는다는 것을 나타내는 것입니다.

4

또 다른 방법은 const 포인터의 정확한 의미는 그 포인터 나 다른 포인터 또는 동일한 객체에 대한 참조를 통해 볼 수있는 pointed-to 객체를 변경할 수 없다는 것입니다 . 그러나 객체가 소멸되면 이전에 삭제 된 객체 인 이 이미 점유 한 주소에 대한 다른 모든 포인터는 해당 객체에 대한 포인터가 아닙니다.. 그들은 같은 주소를 저장하지만 그 주소는 더 이상 어떤 객체의 주소가 아닙니다. 사실 곧 다른 객체의 주소로 재사용 될 것입니다.

이 구분은 C++의 포인터가 약한 참조처럼 작동하면 즉, 개체가 파괴 되 자마자 모든 현존 포인터가 즉시 0으로 설정된다는 점에서 더욱 분명합니다. (이것은 모든 C++ 프로그램에 적용하기에는 너무 비싸다고 생각합니다. 실제로는 완전히 신뢰할 수있게 만드는 것이 불가능합니다.)

6

const가 아닌 멤버를 호출 할 수 없습니다. 함수는 const 포인터를 사용합니다.

예.

class Foo 
{ 
public: 
    void aNonConstMemberFunction(); 
}; 

Foo* const aConstPointer = new Foo; 
aConstPointer->aNonConstMemberFunction(); // legal 

const Foo* aPointerToConst = new Foo; 
aPointerToConst->aNonConstMemberFunction(); // illegal 

const 개체에 대한 const 포인터가 아닌 const 개체에 const 포인터를 혼동했습니다.

delete aConstPointer; // legal 
delete aPointerToConst; // legal 

이미 여기에 다른 답변에서 언급 한 이유 중 하나를 삭제하는 법률이다,라고 말했다 가졌어요.