2010-07-29 3 views
1

C++ 프로그래밍 경험은 대부분 학교 프로젝트였습니다. 그렇게하여 외부 라이브러리 사용 (예 : 부스트)이 금지되거나 권장되지 않습니다. 따라서 우리는 스마트 포인터를 쓸 수 없었습니다. 우리가 직접 작성하려고하지 않는 한, 일반적으로 프로젝트 범위를 벗어났습니다. 실제 프로젝트에서 실제로 얼마나 많은 메모리 관리가 실제로 수동으로 수행되는지 궁금합니다.실용적인 포인터 사용법 (C++)

나는 이것이 막연한 질문이라고 생각합니다. 메모리 관리가 실제로 실제 프로젝트에서 어떻게 수행되는지 궁금합니다.

+3

std :: auto_ptr은 부스트의 일부가 아닙니다.만약 당신의 프로젝트가 std를 사용하지 않는다면 C++을 가르쳐서는 안된다. (C가 더 적절할 것이다.) – Akusete

+0

'라이브러리 함수 X를 사용하고 싶다면 일반적인 규칙을 기억한다. 라이브러리 버전 ' – Akusete

+0

사람들은 학교에서 도서관 방법의 내부를 배우는 것으로 가정하고 있지만 실제 프로젝트는 라이브러리를 사용하며 테스트 시간이 단축되어서 강력합니다. – KedarX

답변

6

레거시 코드에는 대개 수동 메모리 관리가 많이 있습니다. 누군가가 리팩터링에 시간을 들여주지 않았다면 벌거 벗은 뉴스와 삭제 물을 많이 발견 할 수 있습니다. 어딘가에서 누출되기를 기꺼이 기다리고 있습니다.

저는 C++의 최근 작성되고 잘 작성된 소프트웨어가 대개 스마트 포인터, RAII 등을 사용한다고 생각합니다. 수동 메모리 관리는 오류가 발생하기 쉽습니다.

+0

스마트 포인터는 개체의 범위를 로컬 변수 (스마트 포인터)의 범위에 첨부하기 만합니다. 마술이 아닙니다. 예외를 사용하는 코드에서 안전한 원시 포인터를 만드는 것은 최선의 방법이며, 최악의 경우에는 잘못된 방법입니다. – Akusete

+0

@Tim 예외 상황이 발생할 때와 같이 몇 가지 상황에서 수동으로 메모리를 관리하는 것은 매우 어렵습니다. –

+0

@Vitor 그냥 finally 블록을 사용하십시오. 오, 기다려. * C++에서 눈부신 * –

3

몇 가지 프로젝트에서 내가 부스터를 허용하지 않았지만 그 중 하나에서 초보 스마트 포인터를 굴려 보았습니다.

그렇다면 현실 세계에서는 부스트를 사용하십시오. 타사 라이브러리를 사용하십시오. 바퀴가 밖에 있다면 재발 명하지 마십시오. 당신은 더 생산적 일 것이고, 다른 사람이 이미 작성한 코드를 지루하게 작성하는 데 더 적은 시간을 할애 할 것입니다.

2

"메모리 관리"의 의미에 달려 있습니다.

분명히 엄격한 정의는 자동 변수 (할당 된 스택)가 메모리적인 것이므로 "항상"을 의미합니다. 당신은 아마 그것을 의도하지 않았습니다.

반대쪽에는 raw newdelete 사용법이 있습니다. 이 일 수 없지만 어쨌든 "공통"C++에서 발생합니다. 나쁜 연습, 엉성한, 쉽게 컨테이너로 해결할 수 있습니다. 말 그대로 어딘가에서 스마트 포인터 구현을 복사하여 붙여 넣을 수 있으며, 변명의 여지가 없습니다.

중간에 이상적으로 모든 "관리"가 컨테이너와 함께 자동으로 수행됩니다. 수행해야 할 수도있는 유일한 관리는 주기적 종속성을 끊거나 고유 컨테이너 클래스를 만드는 것입니다.

내 프로젝트에서는 유틸리티 클래스를 만들 때 newdelete 만 사용하므로 newdelete을 다시 가질 필요가 없습니다. 그 후, 일부 컨테이너에 직접 들어가는 경우에만 new을 사용합니다.

0

현실 세계에는 두 가지가 있습니다. 스마트 포인터를 사용하지 않는 프로젝트 코드가 더 많이 나옵니다. 신규 및 삭제의 사용이 가장 보편적입니다.

, 점점 더 많은 프로그래머는 이제 자신의 프로젝트에 부스트와 스마트 포인터를 사용하고 내가 부스트 :: shared_ptr을뿐만 아니라

0

를 사용하는 리팩토링 몇 가지 코드를 본 적이 말했다되고 그것이 또한 만들어 그 shared_ptr을 언급 할 가치가있다 그것은 std :: tr1 :: shared_ptr로 2003 년에 표준 라이브러리에 추가되었습니다. 또는 적어도 공식적으로 라이브러리에 없으면 최근에 사용한 모든 C++ 컴파일러가 함께 제공됩니다.

+0

std :: tr1 (또는 C++ Technical Report 1)의 내용은 제안 된 추가 사항 일 뿐이므로 표준에 나와 있지 않습니다. 그래서 표준 라이브러리와 구별하기 위해 자체 네임 스페이스에 있습니다. 그러나 다음 C++ 표준 인 C++ 0x에 있습니다. – vtorhonen

+0

@vtorhonen : 업데이트 됨 –