2013-04-30 4 views
-2

1.1) std :: vector, QVector, boost :: array를 사용할 때 메모리가 누출 될 가능성이 있습니까 (메모리 사용에있어서 이들의 차이점을 이해하지 못하고 각각의 장점은 무엇입니까?)? 아니면 스마트 포인터처럼 메모리를 따르십니까?배열과 스마트 포인터

1.2) 또는 shared_ptr을 통해 생성하는 것이 더 낫습니까?

2) 더 나은 shared_aray 또는 shared_ptr + 벡터는 무엇입니까?

+1

귀하의 질문에 좀 더 구체적으로 대답하십시오. 이것은 당신이 요구 한대로 일반적인 대답을 할 수있는 것이 아닙니다. – moooeeeep

+0

다운 투표 및 클로즈 투표? 이것은 나에게 꽤 괜찮은 질문처럼 보입니다. 특히 첫 번째 질문에 대한 것입니다. 나는 여기에서 훨씬 더 심하게 보았다. – Angew

+0

누구든지이 뒤늦은 설명을 읽는다면 스마트 포인터와 벡터 벡터 > 또는 ptr_vector 또는 shared_ptr >을 결합하는 것이 가장 잘 모릅니다. 이러한 모든 옵션은 있어야하지만, 더 정확하고 안전하게 사용하고 잠재적 인 메모리 누수가없는 것이 분명해야합니다. – kjefes

답변

2

관리하는 메모리에있는 세 개의 중 하나에서 메모리 누수가 발생할 가능성이 없습니다. 즉, std::vector, QVector 또는 std::array에 저장된 데이터는 컨테이너가 파괴 될 때 올바르게 할당 해제됩니다.

반면에 컨테이너 을 안전하지 않은 방식으로 관리하는 경우 전체 컨테이너가 누설 될 수 있습니다. 예 : new std::vector<int>()과 같은 것을하면 나중에 new이 준 포인터를 누설합니다. 컨테이너를 동적으로 할당하는 이유는 매우 드뭅니다.

또한 안전하지 않은 포인터를 컨테이너에 저장하면 해당 포인터가 가리키는 포인터가 누출 될 수 있습니다.

는 용기 사이의 차이에 관해서는 나열된

  • std::vector 연속 메모리 어레이를 보유하고, 그것이 더 많은 공간을 필요로 할 때 동적으로 성장시킬 수있다. 이러한 각각의 성장에는 더 큰 공간을 할당하고 현재 저장된 요소를 새로운 공간으로 이동 한 다음 이전 공간을 할당 해제하는 작업이 포함됩니다.

  • QVector은 이상한 짐승인데, std::deque과 비슷한 비트입니다. 내부적으로는 마치 포인터의 벡터 인 것처럼 구현됩니다. 즉, QVector<T>std::vector<std::unique_ptr<T>>과 같고 T이 포인터보다 크고 포인터 크기가 T 인 경우 std::vector<T>이라고 생각하면 너무 멀리 떨어져 있지 않습니다.

  • std::array은 동적 메모리를 보유하지 않으며 동적으로 증가 할 수 없다는 점에서 근본적으로 다른 두 가지와 다릅니다. std::array<T, N>T [N] 주변의 매우 얇은 래퍼이며 컨테이너와 같은 인터페이스를 제공합니다. 질문 2에 대해서는

, 각각은 다시 다른 : 그것은, std::vector 캔을 할당있어 일단 shared_array 성장할 수 없습니다. 처음에는 동적으로 할당하는 것이 거의 없기 때문에 std::vector을 스마트 포인터 (또는 모든 포인터)에 저장하는 것이 거의 없습니다.