本地对象指针

时间:2013-04-05 14:08:08

标签: c++ pointers

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还是这种情况不危险(传递本地类对象指针)?

3 个答案:

答案 0 :(得分:5)

如果OwnMethod(pData)将指针存储在somwhere以供以后使用,那么一旦调用Foo::somewhere()的对象被销毁,以后就不再使用了。

如果OwnMethod(pData)仅访问指向的数据,那么您就是安全的。

答案 1 :(得分:3)

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

如果该函数在某处存储指针的副本,而其他东西稍后使用该指针,那么在Foo(因此指针的目标)被销毁之后可能会被访问​​。有各种方法可以防止这种情况;正如你所说,一个是动态分配对象,然后在传递给OwnMethod时转移或共享所有权。智能指针(例如std::unique_ptrstd::shared_ptr)是跟踪动态对象所有权的一种非常好的方法。

答案 2 :(得分:1)

哇,很多问题。

复杂的对象不应传递给任何无效的东西*。

谁写过OwnMethod?

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

事实上,为什么不引用Foo&amp;?

类型

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

然而,就生命周期参数而言 - 只要包装类存在,obj就会存在,所以如果指针没有超出OwnMethod的范围,那么这是可以的。如果OwnMethod导致指针存储在Foo的生命周期之外的其他地方,那么你就会遇到问题,并且可能会在堆上分配obj。 (根本不可能成为Foo的成员。)