局部对象指针
Local object pointer
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_ptr
和std::shared_ptr
,是跟踪动态对象所有权的好方法。
哇,问题真多。
一个复杂的对象不应该被传递给任何void*类型的对象。
谁写了OwnMethod?
为什么不使用Foo*类型的指针?
实际上,为什么不接受类型为Foo&的引用呢?
如果OwnMethod()可能需要接受几种不同类型的对象,那么它应该接受一个基类指针或引用,并使用多态性。
然而,就生命周期参数而言,只要包装类存在,obj就会存在,所以如果指针没有超出OwnMethod的范围使用,这是可以的。如果OwnMethod导致指针在Foo的生命周期之外被存储在其他地方,那么你就有问题了,也许obj应该分配在堆上。
相关文章:
- 为什么指针对象没有调用默认构造函数
- 如何访问双指针对象中的方法
- 如何使用智能指针对象执行成员函数指针
- 调用带有指针对象错误的指针变量
- 如何从模板类重载创建的指针对象上的运算符?
- C++指针对象的运算符重载
- 如何初始化数组指针对象
- 如何打印出唯一指针对象向量中的值(基于范围的循环)?C++
- C++指针对象差异
- 涉及继承,指针对象的交易以及何时进行的问题
- 表达式必须在C 中具有指针对象类型
- 下标需要数组或指针类型表达式必须具有指针对象类型
- 字符指针对象和相应的字符数组元素比较
- 如何在 c++ 中克隆为弱指针对象
- 指针对象使用CPP中的指针表达式进行比较
- Visual Studio中智能指针对象的自定义视图
- 使用指针 /对象 /模板参数正确构成
- 如果我确定只有一个线程一次处理指针/对象,则C/C 仍应使用同步
- 如何将值分配给指针对象 c++
- 更改智能指针对象,然后访问它