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

Dobzhansky 2009-05-07 05:50:35
加精
先上码子:

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 指针时异常了
}



这是设计上的考虑? 还是怎么回事.
...全文
2830 129 打赏 收藏 转发到动态 举报
写回复
用AI写文章
129 条回复
切换为时间正序
请发表友善的回复…
发表回复
dawnx_ 2012-05-09
  • 打赏
  • 举报
回复
支持楼主,加油
chenxkj 2011-11-30
  • 打赏
  • 举报
回复
会得分吗,新手试试。
hehongyue 2011-09-03
  • 打赏
  • 举报
回复
学习学习,楼主辛苦了。
zxq19781221 2010-09-14
  • 打赏
  • 举报
回复
managed c++不懂
zldry 2010-05-07
  • 打赏
  • 举报
回复
不访问对象中的数据成员
orangedoraemon 2010-02-26
  • 打赏
  • 举报
回复
c++郁闷死了,还是学习了
xiansizhe 2010-02-07
  • 打赏
  • 举报
回复
不错过
「已注销」 2009-12-20
  • 打赏
  • 举报
回复

#include <iostream>
using namespace std;
int main()
{
cout < <"sorry,I am a new comer,I don't know what's this,but I am studying!" ;
cout < <"jf" < <endl;
cout <<"sorry,there is a wrong just!";
return 0;
}
「已注销」 2009-12-20
  • 打赏
  • 举报
回复

#include<iostream>
using namespace std;
int main()
{
cout<<"sorry,I am a new comer,I don't know what's this,but I am studying!"
cout<<"jf"<<endl;
return 0;
}
yuzhoufly 2009-05-18
  • 打赏
  • 举报
回复
看不懂
agel0ver 2009-05-11
  • 打赏
  • 举报
回复
learning
wenxin40 2009-05-11
  • 打赏
  • 举报
回复
学习学习,楼主辛苦了。
t421307162 2009-05-11
  • 打赏
  • 举报
回复
学习
FREEDOM123 2009-05-11
  • 打赏
  • 举报
回复
学习!
doreensyh 2009-05-11
  • 打赏
  • 举报
回复
不是太懂,学习一下
wang7890 2009-05-10
  • 打赏
  • 举报
回复
学习
ian3881251 2009-05-10
  • 打赏
  • 举报
回复
学习学习!
bk639 2009-05-10
  • 打赏
  • 举报
回复
迷路了
Dobzhansky 2009-05-10
  • 打赏
  • 举报
回复
再明晰一下:

类库:

// liblib.cs
// csc /t:library liblib.cs
public class A
{
public void f()
{
System.Console.WriteLine("f been called");
}
}


C# 客户端:

class prgram
{
static void Main()
{
A a = null;
a.f(); // 同样一个库函数调用, 这里调用失败
}
}


C++/CLI 客户端:

// caller.cpp
// cl /clr:safe caller.cpp
#using "liblib.dll"
int main()
{
A^ a = nullptr;
a->f();// 而这里调用成功
}


最终我认为这是编译器跟程序员之间的责任问题.
C# 编译器做的更多.
而 C++ 传统认为程序员知道自己在干什么.
benben85 2009-05-10
  • 打赏
  • 举报
回复
赶着来学习一下
呵呵
赶上啦
加载更多回复(104)

7,540

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 VC.NET
社区管理员
  • VC.NET社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧