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

4

3 回答 3

5

如果OwnMethod(pData)将指针存储在某处以供以后使用,则一旦Foo::somewhere()调用的对象被销毁,以后就无法再使用该指针了。

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

于 2013-04-05T14:11:22.997 回答
3

成员变量将与对象一样长Foo,因此指针在调用OwnMethod.

如果该函数将指针的副本存储在某处,而其他东西稍后使用该指针,则存在Foo在销毁(以及因此指针的目标)被销毁之后访问它的危险。有多种方法可以防止这种情况;如您所说,一种是动态分配对象,然后在传递给OwnMethod. 智能指针,例如std::unique_ptrstd::shared_ptr,是跟踪动态对象所有权的一种非常好的方法。

于 2013-04-05T14:14:22.470 回答
1

哇,好多问题。

不应将复杂对象传递给任何采用 void* 的对象。

谁写了自己的方法?

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

事实上,为什么它不使用 Foo& 类型的引用?

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

但是,就生命周期参数而言 - 只要包装类存在,obj 就会存在,因此如果指针未在 OwnMethod 范围之外使用,这是可以的。如果 OwnMethod 导致指针存储在 Foo 生命周期之外的其他地方,那么您就有问题了,也许 obj 应该在堆上分配。(它甚至可能根本不适合成为 Foo 的成员。)

于 2013-04-05T14:20:58.827 回答