局部对象指针

Local object pointer

本文关键字:指针 对象 局部      更新时间:2023-10-16
struct Temp
{
   CString one;
   CString two;
};
class Foo
{
   public:
      Temp obj;
      void somewhere();
}
void Foo::somewhere()
{
   void* pData = static_cast<void*>(&obj);
   OwnMethod(pData); // void OwnMethod(void*);
}

问题是:我应该在堆上创建obj还是这种情况不危险(传递本地类对象指针)?

如果OwnMethod(pData)将指针存储在某个地方供以后使用,一旦调用Foo::somewhere()的对象被销毁,以后的使用就不可能了。

如果OwnMethod(pData)只访问被指向的数据,您是安全的。

成员变量将与Foo对象的存在时间一样长,因此在调用OwnMethod期间该指针将有效。

如果该函数在某个地方存储了指针的副本,然后其他函数使用了该指针,那么在Foo(因此指针的目标)被销毁之后可能会有访问该指针的危险。有很多方法可以防止这种情况发生;正如您所说,一种是动态分配对象,然后在它传递给OwnMethod时转移或共享所有权。智能指针,如std::unique_ptrstd::shared_ptr,是跟踪动态对象所有权的好方法。

哇,问题真多。

一个复杂的对象不应该被传递给任何void*类型的对象。

谁写了OwnMethod?

为什么不使用Foo*类型的指针?

实际上,

为什么不接受类型为Foo&的引用呢?

如果OwnMethod()可能需要接受几种不同类型的对象,那么它应该接受一个基类指针或引用,并使用多态性。

然而,就生命周期参数而言,只要包装类存在,obj就会存在,所以如果指针没有超出OwnMethod的范围使用,这是可以的。如果OwnMethod导致指针在Foo的生命周期之外被存储在其他地方,那么你就有问题了,也许obj应该分配在堆上。