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

5 回答 5

3

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

但是您实际上不应该这样做,因为像这样处理原始指针可能会导致错误,您的代码中已经有一些错误。现代 C++ 允许您以更好的方式做到这一点而无需担心。假设我们从这个(可编译的)代码开始,我用 int 替换了 Obj,但它是本机类型而不是类的事实并不重要:

#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. 您明确声明所有权, aunique_ptr只能由当前范围拥有。当 createObj 创建对象时,通过返回临时(无名)unique_ptr它释放所有权,以便调用者可以随时删除它。这将避免棘手的内存泄漏。
  2. unique_ptr当超出范围或被覆盖时(例如被赋值运算符),删除会自动为您发生。
于 2012-10-23T06:33:21.613 回答
1

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

于 2012-10-23T05:20:57.920 回答
1

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

new分配一个对象并返回一个地址给它。然后,您可以将结果地址分配给您想要的任何指针(适当类型的),无论它可能是deleted 指针、持有“现有”分配对象的指针、持有 NULL 的指针或未初始化的指针。

于 2012-10-23T05:23:18.717 回答
0

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

当您delete使用指针时,您实际上释放了它指向的内存。指针的值(该内存的起始地址)保持不变,直到您通过pointer = NULL或重新分配它pointer = new ..

于 2012-10-23T05:58:39.433 回答
0

您可以重用指针,因为您从未删除过指针;你删除了Obj指针指向的那个。请记住,指针正在存储内存地址。因此,就像您可以将 int 更改为不同的值一样,您始终可以更改指针以记住或指向不同的内存地址。此外,当您对 执行删除操作时foo.pObj,您并不是在说“删除 foo.pObj”。相反,您说的是“删除 foo.pObj 指向的 Obj”。

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

于 2012-10-23T05:59:06.290 回答