纯属个人愚见,欢迎探讨
最近在为自己写的class做一些unit test,碰到为了验证一个私有变量的正确性,强忍住了为去修改class的冲动,尝试了直接冲内存获取对应字段值的方式,就在这里就当给自己记个笔记了
class A{
public:
A(int a){test = &a;}
~A(){}
private:
char * p; //windows32位占下4个字节
char a; //windows32位占下4个字节
int * i; //windows32位占下4个字节
int * test;//windows32位占下4个字节
};
void main(){
int i = 10;
A * a = new A(i);
char * pTemp = (char*)a + sizeof(int*)*3;//in windows_32 this is 12
int* p= NULL;
memcpy(&p,pTemp,sizeof(int*));
printf("%d\n",*p);//得到私有对象
}
以上是通过对象在内存中的布局来推算私有变量的位置的,所以必须要知道class的结构,需要的私有字段的位置
算偏移的时候要考虑编译器的内存字节对齐,上面的例子在linux 64位下每个字段都占8字节,除非用#program_packet()声明