2013-03-31 7 views
0

지도가 있으며 intTest*에 매핑합니다.지도에서 포인터 삭제

모두 Test* 포인터는 나중에 맵에 할당되어 나중에 할당됩니다. 그런 다음 deleteing지도의 값을 설정하고 null으로 설정합니다.

그런 다음 one의 유효성을 확인하고 null으로 가정합니다. 그러나, onenull이 아닙니다.

#include <QString> 
#include <QMap> 
#include <QDebug> 

class Test { 
    QString name; 
public: 
    Test(const QString &name) : name(name) {} 
    QString getName() const { return name; } 
}; 

int main() { 
    QMap<int, Test*> map; 

    Test *one = new Test("one"); 
    Test *two = new Test("two"); 
    Test *three = new Test("three"); 

    map.insert(1, one); 
    map.insert(2, two); 
    map.insert(3, three); 

    for (auto itr = map.begin(); itr != map.end(); itr++) { 
     Test *x = *itr; 
     if (x) { 
      delete x; 
      x = 0; // ** Sets null to the pointer ** // 
     } 
    } 

    if (one) // ** Here one is not 0 ?! ** // 
     qDebug() << one->getName() << endl; // ** And then here crashes ** // 
} 

은 내가 delete루프에서 그들을 보내고있을 때 내가 뭔가를 놓친 것 같아요.

어떻게 고칠 수 있습니까?

두 번째 질문은 정확합니까? deletes 할당 포인터?

답변

4

루프에서 변수 x은 루프 내부의 로컬 포인터입니다. 이 값을 NULL으로 설정하면 실제로 포인터를 NULL으로 설정하지 않습니다. 당신이해야합니까

NULL에 반복자를 역 참조에 의해 반환되는 참조 설정하는 것입니다 :이지도에서 포인터가 NULL 될 것

*itr = nullptr; 

을하지만, 다른 포인터는 여전히 지금을 가리키는 것 할당 해제 된 메모리 영역. 당신이 두 개의 포인터가있을 때


, 그것은 종류의 다음과 같습니다

 
+-----+ 
| one | ---\ 
+-----+  |  +---------------+ 
      >--> | Test instance | 
+-----+  |  +---------------+ 
| x | ---/ 
+-----+ 

당신이이처럼 보이는 포인터의 하나 설정 한 경우 :

 
+-----+ 
| one | ---\ 
+-----+  |  +---------------+ 
      >--> | Test instance | 
+-----+   +---------------+ 
| x | 
+-----+ 

변수를 xNULL이지만 변수 one은 여전히 ​​개체를 가리 킵니다. 개체가 삭제 된 후 해당 포인터를 역 참조하면 정의되지 않은 동작이 발생합니다. 모든 것이 삭제

+0

덕분에, 난 내 두 번째 질문에 대해 어떻게 질문을 업데이트. – deepmax

+1

아마 두 번째 질문에 의해 포인터가 가리키는 메모리가 할당 해제되었는지 여부를 묻는 것입니다. 포인터를 사용하여 delete를 호출하면 포인터가 가리키는 메모리를 할당 해제합니다. 그래서 당신이 그것을 더 접근하려고하면 그것은 "segmentation fault"를 야기합니다. 변수 "one"이 매달려있는 포인터가되기 때문입니다. –

+0

@Atique : 예, 감사합니다. Qt로 의심됩니다. 포인터에 관한이 간단한 문제를 놓쳤습니다. – deepmax

1

가장 쉬운 방법 :

qDeleteAll(map);