为什么第二个指向Object的指针没有设置为NULL而是Object指针?

时间:2011-07-04 14:20:57

标签: c++ oop pointers object delete-operator

#include <iostream>

using namespace std;

class Object{};

class Connection
{
  public:
    Connection(Object * _obj);
    Object * obj;
    void status();
};

Connection::Connection(Object * _obj)
{
  obj = _obj;
}

void Connection::status()
{
  cout << obj << endl;
}


int main() {
  Object * myObj = new Object();

  Connection * myConn = new Connection(myObj);

  delete myObj;
  myObj = NULL;

  cout << myObj << endl;
  myConn->status();
  /*
  Output is:

  0
  0x25ec010

  but should be:

  0
  0

  */
}

我以为我只在这个例子中使用指针。所以我不明白为什么“myConn”中的指针也没有设置为NULL,因为有两个指针指向同一个地址。

4 个答案:

答案 0 :(得分:1)

*myConn制作了myObj指针的副本(当您说obj = _obj;时)。副本未设置为null。 (但它仍然指向一个现在无效的地址,所以不要取消引用它!)

答案 1 :(得分:1)

它不应该是0,因为您正在复制指针值。请尝试使用引用(&amp;)代替。

也许这不是一个最好的例子,而boost::shared_ptr将是更好的解决方案,但这段代码可行:

 // skipped...
 class Connection
 {
 public:
   Connection(Object **_obj);
   Object **obj;
   void status();
 };

 Connection::Connection(Object **_obj) : obj(_obj) { }
 void Connection::status() { cout << *obj << endl; }

 int main()
 {
   Object * myObj = new Object();
   Connection * myConn = new Connection(&myObj);
 // skipped

答案 2 :(得分:0)

Connection :: obj没有指向myObj,它指向myObj持有的值。因此,如果要修复它,则必须在函数中手动将值设置为null。或者创建一个第二个指针,该指针包含一个指向obj的指针,并检查该指针是否为null但是会使其复杂化。

答案 3 :(得分:0)

指针是与其指向的对象分开的实体。

指向同一个对象的几个指针彼此没有关系(除了它们指向同一个对象的事实),因此它们必须单独管理。

这个事实导致您发布的代码示例出现问题:使用myObj指针删除对象后,您正确地将指针设置为NULL以指示它不再指向有效对象。但是,myConn->obj指针仍指向已删除的对象(即指针不再有效)。

使用共享指针(boost::shared_ptr)可以在这种情况下提供帮助。