2012-06-05 3 views
1

소멸자가 개체 참조가 매개 변수로 전달 될 때 함수 (pass (sample const & ob1)) 범위가 끝난 후 호출되는 이유는 무엇입니까? 객체 참조를 전달하는 동안 함수 pass()에서 새 객체를 만드는 이유는 무엇입니까? 이에개체 참조가 매개 변수로 전달 될 때 소멸자가 끝나는 함수 범위 이후에 소멸자가 호출되는 이유는 무엇입니까?

도움말 날, 나는 메모리 덤프 오류

#include<iostream> 
using namespace std; 


class sample 
{ 
public: 
    int *ptr; 
    sample()  
    { 
     cout<<"this is default constructor & addr "<<this<<endl; 
    } 
    sample(int i) 
    { 
     cout<<"this is single parameter constructor & addr "<<this<<endl; 
     ptr=new int[i]; 

    } 
    void disp() 
    { 
     cout<<"hello \n"; 
    } 
    ~sample() 
    { 
     cout<<"destructor & addr "<<this; 
     delete ptr; 
    } 

}; 



sample pass(sample const& ob1) 
{ 

for(int i=0;i<5;i++) 
    ob1.ptr[i]=10; 
return ob1; 

} 

int main() 
{ 
sample obj(5); 
sample copy; 
cout<<"before calling \n"; 
obj.disp(); 
pass(obj); 
copy.disp(); 
cout<<"after calling \n"; 
return 0; 
} 
+4

'패스'가 사본을 반환하고 있다는 것을 알고 계십니까? – Fanael

+0

''delete ptr;''이 잘못되었으므로, 어떤 값을 반환하지 않더라도 (new 타입을 사용했기 때문에)''new []'' – Davidbrcz

답변

0

당신은 값에 의해 sample 반환하는을 얻고있다; 이것은 sample의 구성 및 파괴를 포함합니다 (특정 상황에서는 optimised away 일 수 있음).

sample pass(sample const& ob1) 
{ 
    //... 
    return ob1; 
} 

을 그리고 망막 정맥 폐쇄가 발생하지는 않습니다 : 당신이 값으로 반환하기 때문이다

+0

을 사용했기 때문에''delete [] ptr; 메모리 덤프 오류가 발생합니다 ... – sai

+0

@ saai : 좋아요,하지만 그건 별개의 문제입니다. [Three of Rule] (http://stackoverflow.com/questions/4172722/what-is-the-rule-of-three)에 관해 읽어야합니다. –

+0

감사합니다 yar, 이제 3 규칙 및 복사 생성자, 복사 할당 연산자 – sai

2

. 이 경우에도 나는 그것이 확실하지 않다. 이 발생할 수있다.

+0

지워진 메신저 우리가 그 함수에서 소멸자를 호출하면 안된다? – sai

+0

@sai 반환 유형을 사용하고 있지 않습니다. 따라서 아무 것도 반환하지 마십시오. 가치로 돌아 가야한다면, 그것을 막을 수 없습니다. –

0

함수 pass()는 참조가 아닌 값에 의해 객체가 반환되기 때문에 새 객체를 만듭니다. 값으로 개체를 반환하면 복사본 생성자가 호출되고 함수가 반환 되 자마자 삭제 될 새 개체 (임시 개체)가 만들어집니다.

임시 개체 생성을 피하려면 참조로 개체를 반환하십시오. 또한 기본 생성자가 정수 포인터를 초기화하지 않아 메모리 덤프 오류가 발생합니다.

sample const& pass(sample const &ob1) 
{ 

for(int i=0;i<5;i++) 
ob1.ptr[i]=10; 
cout << "pass & addr " << &ob1 << endl ; 

return ob1; 

} 
sample()  
{ 
    cout<<"this is default constructor & addr "<<this<<endl; 
    this->ptr = new (int); 
} 
관련 문제