2010-08-15 4 views
4

전체에서 원시 포인터를 사용하는 코드가 있습니다.원시 포인터와 shared_ptr 사이의 C++ 인터페이스

원시 포인터를 shared_ptr로 가져 오는 메소드를 호출해야합니다. 이 방법은 외부 API에 속한 제 통제하에 있지 않습니다. 포인터가 shared_ptr에 전달 될 수없는 이유는 shared_ptr이 메소드의 범위를 벗어날 때 (메서드가 반환 될 때) 이 삭제 될 것이기 때문입니다.

내 내부 코드에서 원시 포인터를 shared_ptr로 만드는 것 외에 다른 옵션이 있습니까?

+0

전체에서 원시 포인터를 사용하는 이유는 무엇입니까? – GManNickG

+0

내 코드가 아닙니다. 현재 소유/유지 관리하고있는 회사의 코드입니다. 포인터를 shared_ptrs로 이동시키는 것이 가치있는 목표입니까? 의견? – user231536

+0

@user : 상황에 따라 다릅니다. 코드를 더 안전하고 빠르며 깨끗하게 만들 수 있고 시간이 있다면 모든 코드를 수정해야합니다. 그러나 때로는 가지고있는 것과 함께 실행하고 거기에서 향상시켜야합니다. 즉, 완료해야 할 작업과 시간이 오래되고 깨진 코드를 업그레이드해야하는 경우에만 집중하십시오. (코드가 원시 포인터로 깨 졌으므로 계속 진행할 수 없다면 분명히 해결할 수 있습니다.) – GManNickG

답변

10

이것은 매우 위험한 잠재적으로 다소 독특하고 소리, 그러나 당신은 shared_ptr 구성 할 때 노 연산 Deleter가를 사용하여이 작업을 수행 할 수 있습니다 :

struct no_op_delete 
{ 
    void operator()(void*) { } 
}; 

int* p = 0; // your pointer 
std::shared_ptr<int> sp(p, no_op_delete()); 

sp과 그것을 수행 된 모든 사본이 파괴되었을 때 , no_op_delete이 호출되어 보류 포인터를 정리합니다. 그것이 아무것도하지 않기 때문에, 당신은 당신이 필요로하는 행동을 얻습니다.

+0

James McNellis는 결코 xD를 잠자기하지 않습니다. –

+0

@Prasoon : 수면은 프로그래밍을 낭비 할 수있는 시간을 낭비합니다. –

+0

Hehe, http://serendip.brynmawr.edu/exchange/node/1690을 읽어야합니다 .-) –

1

James는 이미 질문에 대답했습니다. 그래서 이것은 단지 하나의 제안 일뿐입니다. 함수 호출이 (일부 데이터 멤버를 설정하는 것과 같이) 객체를 수정하지 않는다는 것을 알고 있다면, 원시 포인터에서 새로운 객체를 생성하고 shared_ptr을 통해 함수에 전달할 수 있습니다. 그런 식으로, 당신은 함수가 객체의 소유권을 취하고 필요한 모든 것을 수행한다고 가정합니다. 물론이 함수가 함수를 수정하면 함수가 작동하지 않습니다. 이 함수가 객체를 읽기 전용으로 사용하여 다른 작업 (예 : 파일 I/O)을 수행하는 경우에 사용할 수 있습니다.

관련 문제