2013-08-17 2 views
0

스마트 포인터에 대한 몇 가지 가이드를 읽었습니다. 그 말의 의도를 이해할 수 있다고 생각하지만, 아직 그것에 대해 신경 쓰이는 것이 있습니다.스마트 포인터 및 스택 개체

스마트 포인터는 new를 사용하여 힙에 할당 된 데이터에 대한 포인터로 작업하기위한 것이고 일단 스마트 포인터가 범위를 벗어나면 소멸자는 포인터가 가리키는 정보를 할당 해제합니다. 그러나 실수로 스택 포인터가 힙 대신 스택에 할당 된 객체를 가리킨다 고 가정합니다. 이 경우 스택 객체에서 delete를 사용하려고하므로 불쾌한 세그멘테이션 오류가 발생합니다.

문제를 설명하기 위해 여기에 두 가지 코드 스 니펫이 있습니다. 이 데모에서는 스마트 포인터에 this 구현을 사용했습니다. 첫째, 적절한 방법은 스마트 포인터를

int main(void) 
{ 
    int my_num = 17; 
    int *p = new int(my_num); 
    MyAuto_Ptr<int> p2(p); 

    return 0; 
} 

를 사용하고 여기에 버그 버전은 분할 오류가 발생합니다 스택 객체에 대한 포인터와 함께입니다.

int main(void) 
{ 
    int my_num = 17; 
    int *p = &my_num; 
    MyAuto_Ptr<int> p2(p); 

    return 0; 
} 

스마트 포인터가 스택 개체를 가리키는 경우 사용자에게 경고하는 방법이 있습니까?

+0

가 교체되는 정의되지 않은 동작을 호출하는 "with"로 세그먼트 화 오류가 발생합니다. 'delete p'와 같습니다. – Elazar

답변

3

첫째, 적절한 방법이 스마트 포인터를 사용하는 적절한 방법 하지이다, 스마트 포인터

없음을 사용할 수 있습니다.

스마트 포인터를 사용하는 전체 아이디어는 이 아닙니다. 처음에는 "원시"포인터를 만듭니다. 그래서 적절한 방법은 다음과 같을 것이다 :

MyAuto_ptr<int> p(new int(my_num)); 

스택 객체에 대한 스마트 포인터 포인트 경우 사용자에게 경고 할 수있는 방법이 있습니까?

일반적인 방법은 없지만 시스템 특정 런타임 검사가 가능할 수 있습니다. 그러나

, 당신이 피 "원시"포인터, 스택 객체와 스마트 포인터를 초기화하는 시도는 즉시 내밀어 것입니다 생각하지 않고, 당신이 잘못 말할 수있다 : "

MyAuto_ptr<int> p(&my_num);