通过使用私有访问说明符在C ++中声明一个类,在内存级别提供了什么保护?

时间:2015-09-19 13:17:22

标签: c++ variables buffer-overflow

是否有可能溢出私有变量?

我不知道从哪里开始研究这个问题,所以任何指针/帮助都会很棒!

3 个答案:

答案 0 :(得分:3)

private变量仅由编译器生成private。它们不位于unreachableprotected内存区域。

如果对象结构众所周知,你可以通过浏览内存来访问它们(风险很大,绝对不推荐,但它证明完全没有保护。

作为证据(https://ideone.com/RRsOkr):

#include <iostream>
using namespace std;

class A
{
public:
    A()
    {
        publicAttr = 4;
        privateAttr = 3;
    }
    int publicAttr;
private:
    int privateAttr;
};


int main() {
    A a;
    std::cout << "Public attribute value is:" << a.publicAttr << std::endl;

    void* aVoid = (void*) &a; // works, but char* is recommended (see comment)
    aVoid += sizeof( int );
    int privateAttrValue = *((int*) aVoid);
    std::cout << "Private attribute value is:" << privateAttrValue << std::endl;

    return 0;
}

该程序输出两个属性值,即使一个属性值不可访问!

4
3

答案 1 :(得分:3)

在内存级别,根本没有保护。

纯粹是处理代码的开发人员帮助他们避免错误。

这里有一个例子:

#include <iostream>
using namespace std;

class Test
{
public:
    Test() : x(10) {}
    int getTest() { return x; }
private:
    int x;
};

class Change
{
public:
    int x;
};

int main() {
    Test test; // x is 10
    void* vp = &test;
    Change* modify = (Change*)vp;
    modify->x = 15;
    cout << test.getTest(); // prints 15
    return 0;
}

查看实际操作:http://ideone.com/MdDgUB

答案 2 :(得分:1)

私有,公共和受保护的访问说明符不提供任何级别的内存保护。