首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > VC >

散分, C++/CLI 奇异行为, 走过路过不要错过

2012-12-28 
散分, C++/CLI 怪异行为, 走过路过不要错过先上码子:ref class A{private:int istatic int jpublic:A(){

散分, C++/CLI 怪异行为, 走过路过不要错过
先上码子:


ref class A
{
private:
  int i;
  static int j;
public:
  A()
  {
    i = 0;
  }
  
  void f()
  {
    System::Console::WriteLine("f been called");
    System::Console::WriteLine(j);
    //System::Console::WriteLine(i);// exception 了
  }
  
  virtual System::String^ ToString () override
  {
    System::Console::WriteLine("tostring been called");
    return "A:";
  }  
};
  


int main()
{
  A^ a;// = nullptr; // 置空一样
  a->f();
  System::Console::WriteLine(a->ToString());
}


程序输出:
f been called
0
异常

没去搞 IL 看是怎么回事, 大家来说说 f 为啥使用空实例 handle 就可以调用来, 
f 内部对成员的访问也挺好玩


这是做 clr host 时碰到的, 实际代码

Class^ a = nullptr;
try
{
  gcnew Class();// 这里一时忘了对 a 赋值
  a->CallShit();// 函数里头访问 this 指针时异常了
}



这是设计上的考虑? 还是怎么回事.
[解决办法]
不要错过
[解决办法]
 managed c++不懂
[解决办法]
还有更怪的呢
例如你的代码在如果f 里访问this指针 会报错
如果你改成这样

A a;
a.f();则不会
毕竟原生c++和 .net 有太大差别,把二者合为一体,很多东西,不能像c# vb.net 那样。
还需要编译器作些工作
[解决办法]
对象不存在,(this指针无效),如果不访问对象中的数据成员和虚表则不会出问题,反之访问对象中的数据或者调用虚函数等情况就会产生异常。
[解决办法]
本帖最后由 hdt 于 2009-05-07 21:34:32 编辑 看看atl的源码
#define offsetof(s,m)   (size_t)&reinterpret_cast<const volatile char&>((((s *)0)->m))
stddef.h
[解决办法]
学习一下!
[解决办法]
学习学习,楼主辛苦了。
[解决办法]
学习一下!
[解决办法]
学习
[解决办法]
收藏。。。
[解决办法]
学习

[解决办法]
路过
[解决办法]
收藏
[解决办法]
MARK 学习
[解决办法]
学习学习,楼主辛苦了。
[解决办法]
学习大家的编程思想
[解决办法]


离沙发远了
[解决办法]
123123123123123123123123
[解决办法]
a->f() 因为该方法不是虚方法,所以CLR用call 指令调用,该指令不会检查this指针是否为NULL。

若把f()改成virtual,CLR则用callvirt调用,该指令会检查this指针是否为NULL, 此时调用f()是就出错了.


virtual void f()
{
System::Console::WriteLine("f been called ");
Console::WriteLine(j);
}



[解决办法]
LOOK LOOK
[解决办法]
学习学习,楼主辛苦了
[解决办法]
回帖是一种美德!每天回帖即可获得 10 分可用分!
[解决办法]
study
[解决办法]
学习学习,楼主辛苦了,谢谢共享!
[解决办法]
没有错过
[解决办法]

[解决办法]
virutal 很好理解
因为 virtual 函数只有在运行时才能确定调用那个,所以要检查
[解决办法]
jf
[解决办法]
学习了,帮顶下。
[解决办法]
up
[解决办法]
oo
[解决办法]
引用:
引用:

引用: 
引用: 
引用: 
对象不存在,(this指针无效),如果不访问对象中的数据成员和虚表则不会出问题,反之访问对象中的数据或者调用虚函数等情况就会产生异常。 


事实上, 调用端是不知道函数内部是否会访问实例成员的, 从调用端看, f 必要求 a 为一个合法实例. 

不一定,这是C++特性造成的 
class a{ 
public: 
void test(){}; …

同意
[解决办法]
进来学习一下啊!!
[解决办法]
这个还是以前读书搞过的,现在已经忘的差不多了
[解决办法]
I don't like vc.mark
[解决办法]
学习
[解决办法]
学习了,,,
[解决办法]
不知道C++
[解决办法]
jf
[解决办法]
帮顶了  
[解决办法]
学习了.
[解决办法]
jf
[解决办法]
学习
[解决办法]
板凳
[解决办法]
路过,帮顶
------解决方案--------------------


学习
[解决办法]
mark
[解决办法]
c++ 比较灵活,功能更强,同样程序员的责任也更大,不能太依赖编译器和运行环境
你可以看看mfc的源码

到处都是
ASSERT

所以用之前最好自己判断一下

if( class==nullptr )
[解决办法]
jf 不能错过
[解决办法]
路过.
[解决办法]
板凳
[解决办法]
帮你顶了!
[解决办法]
帮顶了
[解决办法]

int main()
{
  A^ a = new A; // 连指向的对象都没有,指针很茫然!
  a->f();
  System::Console::WriteLine(a->ToString());
}
[解决办法]
学习 啊呵呵
[解决办法]
学习 学习
[解决办法]
200分,不错。
[解决办法]
学习
[解决办法]
沒錯過
[解决办法]


友情up!!!
[解决办法]
没错过,来了
[解决办法]
up
[解决办法]
……不懂
[解决办法]
学习
[解决办法]
学习下!~~~~~~~~~

[解决办法]
学习
[解决办法]
路过
[解决办法]
JF,路人甲
[解决办法]
路过绝不会错过!
[解决办法]
JF,路人XXX
[解决办法]
帮你顶一下
[解决办法]
路过
[解决办法]
友情UP
[解决办法]
这个可能与编译后把this指针放在第一个参数的原因吧,在编译后可能是
void Test(A ^a);
由于你的函数不使用a指针所以不会报错吧 
[解决办法]
友情UP
[解决办法]
路过。。。看不懂...
[解决办法]
帮顶!!
[解决办法]
学习一下!
[解决办法]
看看
------解决方案--------------------


恩,是该好好学学c++
[解决办法]
怎么个怪异法呢
[解决办法]

[解决办法]
该回复于2009-05-11 13:58:43被版主删除
[解决办法]
痛苦呀!加油

热点排行