允许在不泄露指针地址的情况下访问指针的数据

Give Access to a Pointer's Data Without Revealing Pointer Address

本文关键字:指针 地址 访问 数据 情况下      更新时间:2023-10-16

我有一个包含指针的类。我想阻止类的用户访问指针的地址(这样他们就不能将其设置为另一个地址、删除它或其他什么)。但是,我希望用户能够修改指针数据(或成员数据,如果它不是 POD)以及调用指针的方法(假设它有任何)。

有没有办法返回指针或引用,允许您更改指针指向的数据,而无法更改指针值本身?

所以:

class A
{
public:
    int Value;
    void Method();
};
class Wrapper
{
public:
    Wrapper()
    {
        Pointer = new A;
    }
    // Method that somehow would give access to the object without 
    // Allowing the caller to access the actual address
    A* GetPointer()
    {
        return Pointer;
    }
private:
    A* Pointer;
};
int main()
{
    Wrapper foo;
    foo.GetPointer()->Value = 12; // Allowed
    foo.GetPointer()->Method();   // Allowed
    A* ptr = foo.GetPointer();    // NOT Allowed
    delete foo.GetPointer();      // NOT Allowed
    return 0;
}

意识到我可以使用 getter 和 setter 修改成员数据,但我不确定如何处理这些方法(也许传递方法指针?),我想知道在我接受我个人认为看起来很混乱的解决方案之前是否有更好的方法。

是不可能的。->Value合法的全部原因是因为左侧的表达式是指向A*的(智能)指针。

显然,使用非智能指针,您已经拥有了A*。由于原始指针不是用户定义的类型,因此不能弄乱重载分辨率。

有了智能指针,(*ptr).Value必须工作。这意味着您必须从operator*返回一个A&,这反过来意味着&(*ptr)从智能指针获取 traw 指针。

对于试图阻止operator&的类,甚至还有std::addressof

你可以做一个getter 这返回对对象的引用,例如:

A &GetObject()
{
    return *Pointer;
}

这允许完全访问指向的对象,而无需提供对指针本身的访问。