2011-03-28 5 views
1

에서 포인터를 자유롭게 :코드를 감안할 때 다른 함수

#include<iostream> 
using namespace std; 

class String 
{ 
     char *pstr; 
     unsigned size; 
     public: 
      String(){ pstr=0;size=0;} 
      String(const char *); 
      void show(){ cout << pstr << endl ; } 
      ~String() { cout << "In Dtor" << endl; delete [] pstr; } 

}; 

String::String(const char * cptr) 
{ 
    size = strlen (cptr) + 1; 
    cout << "String is - " << cptr << " - of size " << size - 1 << endl ; 
    pstr = new char [ size ] ; 
    for (int i = 0 ; i < size ; i++) 
     pstr[ i ] = cptr [ i ]; 

} 



int main() 
{ 
    String s("Hello World"); 
    s.show(); 
    s.~String(); 
} 

출력 :

String is - Hello World - of size 11 
    Hello World 
    In Dtor 
----Debug Assertion Failure---- 
    In Dtor 

왜 소멸자가 다시 호출 나올까요? 소멸자를 호출했을 때?

그리고 어설 션 오류 란 무엇입니까?

또한이 코드는 유효합니까?

char * ptr=0;  

void fun() 
{ 
     const char * p = "Hello World"; 
     int size = strlen(p)+ 1; 
     cout << size << endl; 
     ptr = (char *)malloc(size); 
     for (int i = 0 ; i < size ; i++) 
     ptr[ i ] = p [ i ]; 
     cout << p << endl << ptr << endl ; 
} 

int main() 
{ 
    fun(); 
    free (ptr); --> Note 
} 

포인터를 다른 기능에서 해제 할 수 있습니까? 이것이 내가 여기서 이해하려고하는 주요한 것입니다.

+0

소멸자에 대한 명시 적 호출이 필요하지 않은 경우, 무료 저장소를 사용하고 있지 않습니다. – DumbCoder

+0

@DumbCoder : 힙을 사용하는 경우에도 명시 적으로 소멸자를 호출하지 않습니다. 당신은 단지'delete'를 호출합니다. – Xeo

+0

@Acme : 편집 중 : 예, 할 수는 있지만 실제로는 같은 질문에 속하지 않습니다. 또한, 나는 그것이 전에 대답되었습니다 : 확신하기 전에 검색! – Xeo

답변

10

수동으로 소멸자를 호출하지 않아야 - s가 어설 션 오류가 뭔가 assert(somecondition) 및 somecondition라고 거짓 이었다는 것을 의미

'}'최종에서 범위를 벗어나 때 호출합니다. 이것은 여러분의 가정을 검증하는 데 사용되는 기법입니다. 여러분의 코드가 어떤 특정한 조건에 맞으면, 버그가 없다면 그 조건이 참이어야합니다. 그런 다음 assert를 삽입하십시오.

그런 다음 어설 션을 활성화하여 컴파일하도록 선택할 수 있습니다. 즉, 가정이 잘못되었을 경우 이러한 오류가 발생합니다. 릴리스 빌드의 경우 종종 assertion을 사용하지 않도록 설정합니다. assert 문에 대한 코드는 생성되지 않으며 추가 런타임 비용도 없습니다.

수동으로 소멸자를 호출하는 것이 올바른 경우가 있습니다 - "배치 새 파일"에 대해 배우고 사용할 때까지는 필요하지 않습니다. 당신이에 하나 비활성화 복사 생성자/할당 연산자를 가지고, 또는 (제대로 그들을 구현 :

당신의 코드가 수동 소멸자 호출을 제거 후에도 이중 삭제하는 경향이 남아있을 것입니다 : 에릭 말했다 이미 무슨 이외에

+1

+1 - 명확히하기 : 소멸자가 수동으로 한 번 호출되면,'s'가 범위를 벗어날 때 다시 호출됩니다. –

1

힙 할당 메모리 소유를 주장하는 경우 참조 카운팅이 필요합니다.

+1

댓글이어야합니다. :) – Xeo