지도가 있으며 int
을 Test*
에 매핑합니다.지도에서 포인터 삭제
모두 Test*
포인터는 나중에 맵에 할당되어 나중에 할당됩니다. 그런 다음 delete
ing지도의 값을 설정하고 null
으로 설정합니다.
그런 다음 one
의 유효성을 확인하고 null
으로 가정합니다. 그러나, one
은 null
이 아닙니다.
#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
루프에서 그들을 보내고있을 때 내가 뭔가를 놓친 것 같아요.
어떻게 고칠 수 있습니까?
두 번째 질문은 정확합니까? delete
s 할당 포인터?
덕분에, 난 내 두 번째 질문에 대해 어떻게 질문을 업데이트. – deepmax
아마 두 번째 질문에 의해 포인터가 가리키는 메모리가 할당 해제되었는지 여부를 묻는 것입니다. 포인터를 사용하여 delete를 호출하면 포인터가 가리키는 메모리를 할당 해제합니다. 그래서 당신이 그것을 더 접근하려고하면 그것은 "segmentation fault"를 야기합니다. 변수 "one"이 매달려있는 포인터가되기 때문입니다. –
@Atique : 예, 감사합니다. Qt로 의심됩니다. 포인터에 관한이 간단한 문제를 놓쳤습니다. – deepmax