Skip to content

使用单指针不能解决指针偏移的问题,cast 后出现错误 #8

Description

@zhuuuoyue

以下代码出现错误:

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_ptrstd::weak_ptr,使用双指针。VT* 的指针解决转换和访问问题,void* 指针和 deleter 解决对象的生命周期问题,void* 不参与类型转换。

注意:

  • 修改完成后,添加相关的单元测试用例。
  • 如果有接口变化(包括参数变量、删除接口、增加接口),需要同步修改文档注释。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

No labels
No labels

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions