至于你原来的问题:是的,你可以重新分配给这样的指针。指针只保存一个内存地址,仅此而已。
但是您实际上不应该这样做,因为像这样处理原始指针可能会导致错误,您的代码中已经有一些错误。现代 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
包装器替换了它们。这有几个优点:
- 您明确声明所有权, a
unique_ptr
只能由当前范围拥有。当 createObj 创建对象时,通过返回临时(无名)unique_ptr
它释放所有权,以便调用者可以随时删除它。这将避免棘手的内存泄漏。
unique_ptr
当超出范围或被覆盖时(例如被赋值运算符),删除会自动为您发生。