#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,因为有两个指针指向同一个地址。
答案 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)可以在这种情况下提供帮助。