老帖子了,希望这一次,有人解答,该如何解决
老帖子了,希望这一次,有人解答
------解决方案--------------------
这有啥?
一切都是二进制,一切都是规则.
规则不是绝对的,绕过就是了.
char *p=new char[1024];
Test2 &t=*(Test2*)p;
t.Print();
------解决方案--------------------
没必要纠结这种问题
C++的规则是建立在它的语法上的
到底层 成员函数仅仅就是个普通函数而已 只是不能直接调用 _thiscall把调用对象的指针mov ecx [ebp+offset]
然后call ........
所以只要符合了a是一个符合 的对象类型 它都这样调用 但是这个行为是未定义的
就像结构体访问它的元素 你厉害的话也可以直接用首地址加偏移访问各个元素(当然可能有对齐) 但是这个已经不是C++赋予我们的规则了
就像private成员 我有个对象 依然可以访问到它 获取对象的首地址 转成char* 加偏移强制转换即可
------解决方案--------------------
------解决方案--------------------
- C/C++ code
class Test2 { public: int a; void Print() const { cout<<"hello"<<endl; } public: Test2( int val=23):a(val){} ~Test2(){} }; int main() { Test2* p =(Test2* )( operator new( sizeof(Test2))); //只分配内存,没有调用构造函数 //Test2* p= new Test2(34); p->a=32; p->Print(); //operator delete (p); p->~Test2(); //析构 operator delete(p); //释放内存 return 0; } 疑问: 当 operator new之后,没调用构造函数,为什么 p->a ,p->Print() 可以运行???? 对象不是没有构造吗????? 仅仅是分配了内存而已。 如果没有构造,为什么表型出 类的行为来
------解决方案--------------------
这有啥?
一切都是二进制,一切都是规则.
规则不是绝对的,绕过就是了.
char *p=new char[1024];
Test2 &t=*(Test2*)p;
t.Print();
------解决方案--------------------
没必要纠结这种问题
C++的规则是建立在它的语法上的
到底层 成员函数仅仅就是个普通函数而已 只是不能直接调用 _thiscall把调用对象的指针mov ecx [ebp+offset]
然后call ........
所以只要符合了a是一个符合 的对象类型 它都这样调用 但是这个行为是未定义的
就像结构体访问它的元素 你厉害的话也可以直接用首地址加偏移访问各个元素(当然可能有对齐) 但是这个已经不是C++赋予我们的规则了
就像private成员 我有个对象 依然可以访问到它 获取对象的首地址 转成char* 加偏移强制转换即可
------解决方案--------------------
------解决方案--------------------
- C/C++ code
Test2* p = 0 ; p->Print();