以下代码出现错误:
DEFINE_TEST_BEGIN(OwnerPtrTest, Cast, Offset)
{
class BaseObject
{
public:
BaseObject(int value) : m_value(value) {}
~BaseObject() = default;
int GetValue() const { return m_value; }
private:
int m_value{ 0 };
};
class DerivedObject : public BaseObject, public TestableObject
{
public:
DerivedObject(int value) : BaseObject{ value } {}
};
OwnerPtr<DerivedObject> d = OwnerPtr<DerivedObject>::Create(42);
OwnerPtr<BaseObject> b = d.Cast<BaseObject>();
EXPECT_EQ(b->GetValue(), 42);
}
DEFINE_TEST_END
其根本原因是:指针转换成 void* 后,再 static_cast 回到 VT* 时,不会计算指针偏移,导致 cast 后的指针是错误的,因此调用成员函数或访问成员变量都是错误的。
修改方法:参考标准库的 std::shared_ptr 和 std::weak_ptr,使用双指针。VT* 的指针解决转换和访问问题,void* 指针和 deleter 解决对象的生命周期问题,void* 不参与类型转换。
注意:
- 修改完成后,添加相关的单元测试用例。
- 如果有接口变化(包括参数变量、删除接口、增加接口),需要同步修改文档注释。
以下代码出现错误:
其根本原因是:指针转换成
void*后,再static_cast回到VT*时,不会计算指针偏移,导致 cast 后的指针是错误的,因此调用成员函数或访问成员变量都是错误的。修改方法:参考标准库的
std::shared_ptr和std::weak_ptr,使用双指针。VT*的指针解决转换和访问问题,void*指针和 deleter 解决对象的生命周期问题,void*不参与类型转换。注意: