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
还是这种情况不危险(传递本地类对象指针)?
答案 0 :(得分:5)
如果OwnMethod(pData)
将指针存储在somwhere以供以后使用,那么一旦调用Foo::somewhere()
的对象被销毁,以后就不再使用了。
如果OwnMethod(pData)
仅访问指向的数据,那么您就是安全的。
答案 1 :(得分:3)
成员变量将持续与Foo
对象一样长,因此指针在调用OwnMethod
期间有效。
如果该函数在某处存储指针的副本,而其他东西稍后使用该指针,那么在Foo
(因此指针的目标)被销毁之后可能会被访问。有各种方法可以防止这种情况;正如你所说,一个是动态分配对象,然后在传递给OwnMethod
时转移或共享所有权。智能指针(例如std::unique_ptr
和std::shared_ptr
)是跟踪动态对象所有权的一种非常好的方法。
答案 2 :(得分:1)
复杂的对象不应传递给任何无效的东西*。
谁写过OwnMethod?
为什么不采用Foo *类型的指针?
事实上,为什么不引用Foo&amp;?
类型如果可能需要OwnMethod()接受几种不同类型的对象,那么它应该采用基类指针或引用并使用多态。
然而,就生命周期参数而言 - 只要包装类存在,obj就会存在,所以如果指针没有超出OwnMethod的范围,那么这是可以的。如果OwnMethod导致指针存储在Foo的生命周期之外的其他地方,那么你就会遇到问题,并且可能会在堆上分配obj。 (根本不可能成为Foo的成员。)