2016-10-10 9 views
0

나는 더 이상 필요하지 않은 포인터 목록을 가지고 있습니다. 그들 모두를 삭제하기 위해, 나는 일반적으로 목록을 반복 할 수std :: list의 내용 삭제

for (T* ptr: mylist) { 
    delete ptr; 
} 

을 또는 목록이 비어 때까지 나는 첫 번째 또는 마지막 요소를 삭제할 수 있습니다

모두, 선호하는 방법은 무엇
while (!mylist.empty()) { 
    delete mylist.front(); //or mylist.back() 
    mylist.pop_front(); //or mylist.pop_back() 
} 

성능과 선명도?

답변

4

가장 좋은 방법은 std::unique_ptr's을 목록에 저장하고 직접 메모리를 관리하지 않는 것입니다. 그런 다음 mylist.clear()을 수행하면됩니다.

+0

'std :: list :: clear'은 완전히 새로운 것입니다. 그러나 좋은 제안. – user6245072

+0

'clear'는 모든 요소를 ​​목록에서 제거합니다. 제거시 스마트 포인터는 또한 보유하고있는 메모리를 해제합니다. 그러나 일반적인 포인터는 그렇지 않습니다. 따라서이 방법은 스마트 포인터에서만 작동합니다. 어쨌든, 오늘날 수동으로 객체를 삭제하는 것은 오류가 발생하기 쉽기 때문에 나쁜 관행으로 간주됩니다. –

+0

마지막 비트를 알면 좋습니다. 모든 것에 감사드립니다. – user6245072

1

그들은 두 가지 다른 일을합니다. 두 번째는 빈 목록을 남깁니다. 첫 번째는 잘못된 포인터가 들어있는 목록을 남깁니다. 이 작업 후에 목록에 어떤 일이 발생했는지에 따라 중요 할 수도 있고 중요하지 않을 수도 있습니다.

1

첫 번째 예를 사용합니다. 모범 사례를 위해 나중에 잘못된 포인터가 남아 있지 않도록 목록을 지워야합니다.

for (T* ptr : mylist) delete ptr; 
mylist.clear();