2012-10-23 147 views
0

假设:在这种情况下,我可以重新使用指针吗?

struct Foo 
{ 
    Obj* pObj; 
    Foo() : pObj(NULL); 
}; 

Obj* CreateObj() 
{ 
    //do some stuff and then 
    return new Obj; //obj is a class 
} 

int main() 
{ 
    Foo foo; 
    foo.pObj = CreateObj(); 
    DoSomeOperationWithTheObj(foo.pObj); 
    //suppose foo is a monster that should be 'killed' or deleted now 
    delete foo.pObj; 
    foo.pObj = NULL; 
    //the question is can this pointer be 're-used' now like this: 
    foo.pObj = CreateObj(); //create another object 
} 

由于指针被删除,是不是有问题,再次使用它吗?

+4

不要将指针与它“指向”的对象混淆。 – 2012-10-23 05:15:00

+0

@pst你的意思是我应该做'delete * foo.pOBj'? –

+6

是的,您可以将指针重新分配给新的/不同的对象 – mac

回答

3

至于你的原始问题:是的,你可以重新指派这样的指针。一个指针只保存一个内存地址,仅此而已。

但是你不应该这样做,因为像这样处理原始指针会导致错误,你已经有一些在你的代码中。现代C++可以让你做到这一点更好,不用担心。假设我们从这里(编译)代码开始,我取代的OBJ由一个int,但事实证明这是一个原生型的,而不是一类并不重要:

#include <iostream> 

struct Foo 
{ 
    int* pObj; 
    Foo() : pObj(NULL) {} 
}; 

int* CreateObj() 
{ 
    return new int(42); //obj is a class 
} 

int main() 
{ 
    Foo foo; 
    foo.pObj = CreateObj(); 
    std::cout << *foo.pObj << std::endl; 
    delete foo.pObj; 
    foo.pObj = new int(13); 
    std::cout << *foo.pObj << std::endl; 
    delete foo.pObj; 
} 

我们可以将此转换为以下几点:

#include <iostream> 
#include <memory> 

struct Foo 
{ 
    std::unique_ptr<int> pObj; 
    Foo() : pObj(NULL) {} 
}; 

std::unique_ptr<int> CreateObj() 
{ 
    return std::unique_ptr<int>(new int(42)); 
} 

int main() 
{ 
    Foo foo; 
    foo.pObj = CreateObj(); 
    std::cout << *foo.pObj << std::endl; 
    foo.pObj = std::unique_ptr<int>(new int(13)); 
    std::cout << *foo.pObj << std::endl; 
} 

指出,主要的变化是,我删除了原指针和与unique_ptr包装取代了它们。这有几个优点:

  1. 您明确声明所有权,unique_ptr只能由当前范围拥有。 createObj创建对象时,通过返回临时(无名称)unique_ptr它释放所有权,以便调用方可以随时删除它。这将避免棘手的memleaks。
  2. unique_ptr超出范围或被覆盖时(例如,由赋值运算符),删除会自动发生。
+0

我希望我能不止一次地对此赞不绝口 –

1

是的,你可以重新使用指针。指针只是引用对象的一种方式。由于您删除了该对象,因此您可以随意使用该指针来满足您的任何需要。

1

这样做肯定没有问题。指针只是地址的容器(类似于包含值的变量)。

new分配一个对象并返回一个地址给它。然后,您可以将结果地址分配给所需的任何指针(具有适当的类型),无论它是否为delete d指针,保存“现有”已分配对象的指针,NULL保持指针还是未初始化的指针。

0

只要先前分配的内存先被释放,就像您在代码中已经做过的那样,重用指针没有问题。

当你delete一个指针,你实际上释放它指向的内存。指针(内存的起始地址)的值不变,直到您pointer = NULLpointer = new ..

0

重新分配它可以重复使用指针,因为你永远不会被删除的指针;你删除了指针指向的Obj。请记住,指针正在存储内存地址。所以,就像你可以将一个int改为一个不同的值一样,你总是可以改变一个指针来记住或指向不同的内存地址。此外,当您在foo.pObj上执行删除操作时,您并不是说“删除foo.pObj”。相反,你会说“删除foo.pObj指向的Obj”。

如果您在执行delete操作后尝试对foo.pObj指向的对象执行某些操作,则会出现问题。

相关问题