2013-04-05 45 views
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上堆或这种情况并不危险(通过本地类对象的指针)?本地对象指针

+3

完全取决于OwnMethod用指针做些什么。这是一个有生之年的问题,对象被指向在指针之前死亡。如果是这样,那么你有问题,否则你没事。 – john 2013-04-05 14:10:04

+0

为什么不使用OwnMethod(void *)不使用模板? – 2013-04-05 14:14:18

+0

回答信息太少,投票结束。 – Lundin 2013-04-05 14:19:35

回答

5

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

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

3

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

如果该函数将指针的某个副本存储在某处,并且其他内容稍后使用该指针,那么在Foo(因此指针的目标)已被销毁后可能会访问它。有各种方法来防止这种情况发生;正如你所说,一个是动态分配对象,然后传递或共享所有权,当它传递到OwnMethod。智能指针(如std::unique_ptrstd::shared_ptr)是跟踪动态对象所有权的一种非常好的方法。

1

哇,很多问题。

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

谁写的OwnMethod?

为什么不需要Foo *类型的指针?

事实上,为什么不参考Foo型号&?

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

但是,只要包装类一直存在,只要生命周期参数为obj就会存在,所以如果指针未超出OwnMethod的范围,那么这是可以的。如果OwnMethod导致指针被存储在Foo的生命周期以外的其他地方,那么你有一个问题,也许obj应该分配在堆上。 (它甚至可能根本不适合它成为Foo的成员。)