2012-04-27 1 views
5

이렇게 작은 함수 안에서 scoped_ptr을 사용하고 있습니다. 그래서 나는 delete를 호출 할 필요가 없다. 이 사용법에 대해 과도한 것입니까? 우리 팀원은 원시 포인터를 선호하고 삭제합니다. 이것이 매우 중요한 경로에서 사용되는 경우 scoped_ptr 사용 비용은 얼마입니까? 이것은 일렬로 정렬되어서는 안되며 최적화 된 바이너리에서 일반 삭제를 사용하는 것과 정확히 똑같아 야합니까?간단한 경우 scoped_ptr을 사용하는 것은 과도한 행동입니까?

void myfunc() 
{ 
    boost::scoped_ptr<myobj> objptr = someFactory::allocate(); 
    callsomeotherfunc(objptr.get()); 
} 

답변

8

나는 성능 저하의 확신,하지만 scoped_ptr를 사용하여 여기 myfunc() 안전 예외입니다 보장 : callsomeotherfunc()가 동적으로 할당 된 메모리는 여전히 해제됩니다 예외가 발생합니다. scoped_ptr가 사용되지 않았고 callsomeotherfunc() 던질 수 있다면 그 기능이 유사한 구성되어야 할 것이다 : 함수의 모든 미래의 수정 delete objptr; 가능한 모든에 호출되어 있는지 확인해야합니다으로

void myfunc() 
{ 
    myobj* objptr = someFactory::allocate(); 

    try 
    { 
     callsomeotherfunc(objptr); 
     delete objptr; 
    } 
    catch (const some_exception&) 
    { 
     delete objptr; 
     throw; 
    } 
} 

이 오류 경향이있다 출구 지점.

+1

나는'부스트 : scoped_ptr'가 빨리 될 것으로 기대 비 예외적 인 경우에 그리고 예외적 인 경우에 훨씬 더 빠릅니다 (thro ZeroCost 모델은 비용이 많이 든다. –

0

아니요, 아닙니다. 스마트 포인터 사용의 이점 (예 : 예외 안전 및 자동 리소스 정리)은 스마트 포인터 생성, 유지 관리 및 삭제에 필요한 몇 가지 추가 메모리 바이트와 몇 가지 추가 CPU 클럭을 사용하는 경우의 성능 손실보다 훨씬 큽니다.

+0

.. 예외 안전 및 자동 리소스 정리가 절대 일어나지 않아야하는 시점에 함수가 도달하는 경우를 제외하고는 예외입니다. null로 스마트 포인터를 설정하면 정리가되지 않을까요? –

+0

@Martin 흥미로운 아이디어이지만 예외 안전 및 자동 리소스 정리가 바람직하지 않은 경우를 생각할 수 없습니다. 일부 예제를 제공해 주시겠습니까? –

+0

확실히, 쉽게 : 이름 바꾸기 'callsomeotherfunc (objptr);' to 'queueObjectToOutputThread (objptr);'로 변경하십시오. 이제 자동 리소스 정리로 인해 다른 모듈의 일부 장소에서 문제를 일으킨 아마 '안전'모듈과 관련이없는 다른 스레드에서 실행되는 비참한 AV/segfault가 발생합니다. –

3

그 목적으로는 scoped_ptr을 사용하지 않고 이전 컴파일러에서는 unique_ptr (C++ 11에서는 auto_ptr)을 사용합니다. 둘 다 특정 사용 사례에 해당합니다. 그것이 과잉 공격인지 아닌지에 따라, 예외 안전성을 제공하는 유일한 방법입니다 (myfunc 또는 callsomeotherfunc의 코드에서 아무 것도 말할 필요는 없습니다). 성능면에서 3 가지 옵션은 예외가 throw되지 않는 경우 함수의 마지막에 delete 호출을하는 것과 같습니다. 예외가 발생하면 이있는 try/catch 블록을 갖는 것보다 빠릅니다.

또한 일부 디자인에서는 팩토리가 delete이 아닌 deallocate 작업을 호출해야하는 팩토리에서 할당하는 것으로 보입니다. 그렇다면 delete이 메모리를 해제하는 적절한 방법 인 경우 잔인한 스마트 포인터 (shared_ptr)를 사용하거나 managed_ptr 인 경우 deleter을 제공 할 수 있습니다.

+0

'auto_ptr'은'scoped_ptr'을 통해 어떤 이점을 주나요? ('std'와'boost'를 제외하고)? – KillianDS

+0

@KillianDS :이 특별한 경우는 없습니다. 그러나 표준이며 추가 외부 종속성을 가져 오지 않으며,이 경우 유효한 솔루션입니다. –

+1

@ DavidRodríguez-dribeas :'boost :: scoped_ptr'의 의미는'std :: unique_ptr'의 의미와 완전히 다릅니다. 'scoped_ptr'의 주목할만한 속성은 독자의 이익을위한 의미 론적 의미를 추가하는 것입니다 :이 자원은이 범위를 벗어나지 않을 것입니다. –

0

내가 사용을 scoped_ptr를 할 수있는 상응하는 것이라고 생각 : 내가 작성 원합니다 버전을 알고

void myfunc() 
{ 
    myobj* objptr = someFactory::allocate(); 
    try 
    { 
     callsomeotherfunc(objptr); 
    } 
    catch (...) 
    { 
     delete objptr; 
     throw; 
    } 
    delete objptr; 
} 

...

+0

그것은 동일하지 않습니다,'scoped_ptr' 버전은 스택 되감기 때문에 재발행하지 않습니다. – KillianDS

관련 문제