2013-06-12 5 views
0

아래 코드는 메모리 관리의 잘못된 예를 보여줍니다. 항목은 임시 복사본이 대신 반환되기 때문에 할당 취소되지 않습니다.임시 개체를 반환하지 않는 방법 (C++)

나는 몇 주 동안 프로그래밍 포럼을 조사하고 있지만 항목을 할당 해제 할 수있는 동안 Item * 유형의 유효한 인스턴스를 올바르게 반환하는 방법에 대한 명확한 설명을 찾지 못했습니다. 즉, 동일한 반환 값을 얻지 만 항목을 할당 취소 할 수있는이 코드의 더 나은 대안은 무엇입니까?

Item* Inventory::add(const string& name) 
{ 
    Item* item = new Item(name); 
    ...(some other code here)... 
    return item; 
} 

고마워요!

+0

'std :: unique_ptr '은 어떻습니까? –

+0

이것이 왜 문제인지 이해할 수 없습니다. _item_에 대한 포인터의 유일한 복사본을 클라이언트에 반환했습니다. 이제 할당을 해제하는 것이 클라이언트의 작업입니다. 그 사실을 계약/문서/주석에 명시 적으로 나타내십시오. – DaoWen

답변

0

일단 루프 밖으로 나가면 모든 것이 파괴되었다고 생각할 수 있지만 반환되는 포인터 (및이 포인터가 가리키는 메모리는)는 그대로 유지됩니다. 이 메서드를 호출하는 개체로 전송되고 메모리가 유출되지 않습니다.

+0

감사합니다. 한 가지 추가 할 수있게 : 클라이언트의 코드 부분을 소유하고 있지 않아 거기에서 항목을 할당 취소 할 수 없습니다. 메모리 누수를 피할 수있는 또 다른 방법이 있습니까? – user2476826

+0

정말 코드의 일부분의 범위와 가시성에 달려 있습니다. 필자가 본 프로덕션 코드의 한 예로, 하나의 글로벌 마스터 관리자 클래스에 의해 처리되는 많은 "관리자"클래스가 있습니다. 사용자는 마스터 관리자 클래스에 대한 포인터를 만들어야합니다. 그런 다음 사용자가 "manager"클래스 중 하나를 필요로 할 때 그들은 평소와 같이 포인터를 얻기 위해'new'를 호출 할 수 있습니다. 그러나 포인터 자체를 할당 해제해서는 안됩니다. 그들은 단지 마스터 매니저 포인터의'delete'를 호출 할 필요가 있으며, 그러면 기존의 모든 매니저 클래스를 할당 해제합니다. – Neoh