2013-04-28 3 views
2

누출 포인터를 막으려 고 메모리 유출을 막으려 고합니다. intINuiSensor*으로 매핑하려고합니다. 나는 또한 Qt를 사용하고 있기 때문에 나는이 일을 QMap<int, std::unique_ptr<INuiSensor>>를 사용하려고했으나 QMap의 소스 코드를 만드는이 불가능 :QMap 및 std :: unique_ptr

template <class Key, class T> 
Q_INLINE_TEMPLATE typename QMap<Key, T>::iterator QMap<Key, T>::insert(const Key &akey, const T &avalue) 
{ 
    detach(); 
    Node *n = d->root(); 
    Node *y = d->end(); 
    Node *last = 0; 
    bool left = true; 
    while (n) { 
     y = n; 
     if (!qMapLessThanKey(n->key, akey)) { 
      last = n; 
      left = true; 
      n = n->leftNode(); 
     } else { 
      left = false; 
      n = n->rightNode(); 
     } 
    } 
    if (last && !qMapLessThanKey(akey, last->key)) { 
     last->value = avalue; 
     return iterator(last); 
    } 
    Node *z = d->createNode(akey, avalue, y, left); 
    return iterator(z); 
} 

라인 :

last->value = avalue; 

문제를 생성하는 하나입니다 : unique_ptr에 = 연산자를 직접 사용할 수 없습니다. 그래서 지금 나는 다음에 무엇을 해야할지에 대해 의아해하고 있습니다. 다른 방법으로 QMap과 unique_ptr을 사용할 수 있습니까? 어떤 이유로 QMap과 unique_ptr을 사용하는 것이 전체적인 생각입니까? QMap을 사용하면서 누드 포인터를 사용하지 못하게하려면 어떻게해야합니까?

+1

Qt 컨테이너와 Qt 포인터는 솔직히 말해서 똥입니다. 특히'std :: unique_ptr'을 이미 사용하고 있다면 std :: map을 사용하십시오. 또는 _Misuse_'QSharedPointer'. – Lol4t0

+0

@ Lol4t0 강력한 진술입니다. 뒷받침 할만한 증거가 있습니까? – cmannett85

+0

@ cmannett85,이 중 하나 인 QScopedPointer는 이동 의미를 지원하지 않습니다. Qt 컨테이너는 반복자를 수정으로 간주하므로 (qvector.begin()은 스레드로부터 안전하지 않습니다), 순서가 지정되지 않은 집합, 해시 함수 구현은 까다 롭습니다. 하나를 직접 지정하십시오. – Lol4t0

답변

0

물론 이것은 작동하지 않습니다. 고유 한 포인터를 만든 다음 을 복사하여 QMap 복사하십시오.

QSharedPointer을 사용하십시오. INuiSensor* 인스턴스에 대한 모든 참조가 삭제되면 인스턴스가 삭제됩니다.

+0

qmap에 복사하지 않으려 고합니다. qmap으로 옮깁니다. 문제는 QMap이 실제 문제 인 내부 데이터 구조에 QMap을 복사한다는 것입니다. 그게 문제가 QMap 소스 코드에 있고 내 코드가 아니라는 것을 말하는 이유입니다. (내 잘못이 아니지만 적어도 unique_ptr을 옮길만큼 똑똑하고 그냥 복사하지는 않습니다.) – Cheiron

+0

@Cheiron 그런 다음 질문에 언급 했어야합니다. – cmannett85