포인터를 매개 변수로 허용하는 함수가 있다고 가정하십시오. 이 함수는 std::vector<>::push_back()
을 사용하여이 포인터의 수명주기를 관리하므로 예외가 발생할 수 있습니다.괜찮은 표준인가요 :: auto_ptr <> 유스 케이스인가요?
void manage(T *ptr);
과 같이 호출 : :이처럼 선언하면
manage(new T());
는 std::vector<>
에 포인터를 밀어 예외가 발생하는 경우, 내가 효과적으로, 메모리 누수를하지 않은 가지고있다 나는?
void manage(std::auto_ptr<T> ptr);
내 문제를 해결 :이 같은 기능을 선언
겠습니까?
우선 스택에 std::auto_ptr
을 할당하고 (포인터를 통해 소유권을 획득하는 것으로 추측합니다) 예외를 던질 것으로 예상됩니다. 안전한.
그런 다음 함수 내에서 원시 포인터를 std::vector<>
으로 푸시합니다.이 작업이 실패하면 포인터가 추가되지 않지만 스마트 포인터는 여전히 포인터를 소유하므로 포인터가 그대로 유지됩니다. 의해 파괴됨. 푸시가 성공하면 해당 포인터를 통해 스마트 포인터의 소유권을 제거하고 반환합니다. 예외를 throw 할 수 없으므로 항상 정상적으로 작동합니다.
내 이론이 맞습니까?
- 편집 - 나는 할 수 없습니다
아니, 나는 생각한다. 그렇게하면 rvalue에 대한 const가 아닌 참조를 취해야합니다 (스마트 포인터에서 소유권을 제거하기 위해). 나는 그 일을하기 위해서
std::auto_ptr<T> ptr(new T());
manage(ptr);
을 쓰는 것이 좋을지도 모르겠다. 나는 코드를 많이 오염시키지 않고 RAII를 구현할 수 있도록이 글을 쓰고있다. 그 일을하는 것은 도움이되지 않습니다.
void manage(T *ptr)
{
std::auto_ptr<T> autoPtr(ptr);
vector.push_back(ptr);
autoPtr.release();
}
: 그것은 캐치 (22)
것 - - 편집 2
당기 제이슨 Orendorff이 거기 여기에 독자에 의해 빠른 참조를 위해 말, 최고의 솔루션은 다음과 같은 것 같다 이 r- 수치로 쓸모 const가 아닌 참조의 문제를 해결한다.
내가 코딩을하고있어이 클래스를 완료하면 나는 사람이 유용 발견 한 경우에는 다시 여기에 게시합니다.
-3 편집 -
좋아, 여기에 많은 논의가 있었다, 그리고 내가 전에 명확히해야 핵심 포인트가있다. I에 유래에 게시 할 때 일반적으로, 나는 일반적으로, 즉 완전히 쓸모가, 내 질문 뒤에 이유를 설명하려고합니다. 그래서 이번에는 그 지점으로 곧장 가야한다고 생각했습니다. 그것은 불행하게도 내 머리가 지금 교착되어
XD
아주 잘 작동하지 않았다, 그래서 나는 심지어 내가 처음 내 목표를 달성하기 위해 무슨 생각을 제대로 설명 할 수없는 것이라고 생각 끈다.나는 원자 적 연산과 많은 경우에 맞는 예외 - 안전한 코드 작성을위한 좋은 솔루션을 찾으려고 노력하고있다. 그러나 실제로, 나는 이것을 XD로 처리 할 수 없다. 나는 이것이 시간만으로 마스터 할 것 같은 종류라고 생각한다.저는 정말 새로운 C++ 프로그래머이고 게임 개발에 중점을 둡니다. 게임 엔진에서 예외가 발생하면 실행이 끝납니다. 시스템은 내 프로세스를위한 모든 메모리를 확보 할 것이므로 하나 또는 두 개의 포인터가 여기저기서 새어 나오는 것이 중요하지 않습니다. 이제 서버 응용 프로그램을 개발 중이므로 예외를 처리하는 것이 서버를 손상시킬 수 있으므로 예외 처리가 어렵습니다. 요청을 "중단해야"합니다.
"글쎄, 클라이언트, 불행히도 개발자는이 조건을 미리 예상하지 못했기 때문에 나중에 다시 시도해야합니다. (여기까지는 게임 엔진과 기본적으로 동일합니다. 다시 말해, 요청은 프로세스의 전체적인 과정이 아닌 요청의 컨텍스트에만 격리되어 있습니다.) 은 모든 것이 유효한 상태 인에 남아 있기 때문에 당황하지 마십시오 (단, 여기에는 차이점이 하나 있습니다). 종료되지 않았으므로 운영 체제에서 자원을 확보 할 수 없으며 사용자의 계정을 완전히 잠그지 않도록 작업을 지금 실행 취소해야합니다. 예를 들어 서버가 제공하는 전체 서비스). "
다음 번에 더 좋은 질문을 쓸 수 있도록 더 많은 코드를 작성하고 내 문제를 기록 할 것입니다. 나는 지금 이것을 묻기 위해 준비하지 않았다, 정말로 유감스럽게 생각한다.
답장을 보내 주셔서 감사합니다. 정말 stackoverflow를 좋아합니다. 내 질문에 얼마나 빨리 답하고 귀하의 답변을 계몽하는 것이 절대적으로 놀라운 일입니다. 감사.
이 방법을 사용하면'manage'에 다소 이상한 인터페이스가 생깁니다. 모든 상황에서 인수를 삭제할 것으로 예상됩니다 (유지하거나 삭제함으로써). 왜 'auto_ptr'을 통해 노출하는 것이 아니라 자체적으로 할당을 처리하지 않습니까? 나는'auto_ptr'을 주로 내부 구현이 아니라 인터페이스라고 봅니다. –
사실, 인터페이스가 불필요하게 이상합니다. Jason Orendorff가 제안한대로 고정 시켰습니다. –
하나의 어려움이 여전히 남아 있습니다 - 실패하면 소유권을 가져 가야하나요? 그것은 RAII와 예외적 인 안전성 때문에'manage'가 실패하면 포인터의 소유권을 얻지 못했고 따라서 호출자가 여전히 그것을 소유하고 있으므로 자유롭게해야한다고 제안합니다. 그것도 복잡해질 수 있습니다. –