C++指针被析构了如何通知其他存储该指针的地方更新

  • A+
所属分类:C++

函数调用方式

  1. void fun(int* &p)
  2. {
  3.     delete p;
  4.     p = NULL;
  5. }
  6. //调用
  7. int* temp = new int(10);
  8. fun(temp);

问题的根源是如何传递指针,我们可以使用指针引用,将指针以引用的方式传递过去,这样,一旦在函数内析构指针后,外部的指针值将会同步更新。例子中,调用fun函数后,temp指针也会变成NULL

类成员变量存储

A.h文件

  1. #ifndef A_H
  2. #define A_H
  3. class A
  4. {
  5. public:
  6.     A();
  7. };
  8. #endif // A_H

A.cpp文件

  1. #include "a.h"
  2. A::A()
  3. {
  4. }

B.h文件

  1. #ifndef B_H
  2. #define B_H
  3. class A;
  4. class B
  5. {
  6. public:
  7.     B(A* &a);
  8. private:
  9.     A* & m_a;//存储指针的引用
  10. };
  11. #endif // B_H

B.cpp文件

  1. #include "b.h"
  2. #include "a.h"
  3. B::B(A* &a) //传递指针的引用
  4.     :m_a(a)
  5. {
  6. }

调用过程

  1. A* tempA = new A();
  2. B* tempB = new B(tempA);
  3. delete tempA;
  4. tempA = NULL;

调用结束后,tempB中的m_a也更新为NULL。

二级指针

B.h文件

  1. #ifndef B_H
  2. #define B_H
  3. #include <QMap>
  4. class A;
  5. class B
  6. {
  7. public:
  8.     B();
  9.     void append(A** child);
  10.     A* getChild(QString id);
  11. private:
  12.     QMap<QString, A**> m_children;
  13. };
  14. #endif // B_H

B.cpp文件

  1. #include "b.h"
  2. #include "a.h"
  3. #include <QDebug>
  4. B::B()
  5. {
  6. }
  7. void B::append(A ** child)
  8. {
  9.     m_children.insert("id",child);
  10. }
  11. A *B::getChild(QString id)
  12. {
  13.     return *(m_children.value(id));
  14. }

调用过程

  1. A* tempA = new A();
  2. B* tempB = new B();
  3. tempB->append(&tempA);//二级指针
  4. delete tempA;
  5. tempA = NULL;
  6. A* result = tempB->getChild("id");

这时候,取出的result也会是NULL。

Qt大课堂-QtShare

发表评论

您必须登录才能发表评论!