是否有可能溢出私有变量?
我不知道从哪里开始研究这个问题,所以任何指针/帮助都会很棒!
答案 0 :(得分:3)
private
变量仅由编译器生成private
。它们不位于unreachable
或protected
内存区域。
如果对象结构众所周知,你可以通过浏览内存来访问它们(风险很大,绝对不推荐,但它证明完全没有保护。
作为证据(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)
私有,公共和受保护的访问说明符不提供任何级别的内存保护。