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

CLR对C++/CLI类内跟踪句柄型字段的初始化策略是什么?解决办法

2012-02-23 
CLR对C++/CLI类内跟踪句柄型字段的初始化策略是什么?我们都知道System::String是个引用类, 所以不得不使用

CLR对C++/CLI类内跟踪句柄型字段的初始化策略是什么?
我们都知道System::String是个引用类, 所以不得不使用跟踪句柄.
举一个简单的例子:
ABC类的定义,

C/C++ code
public ref class ABC{private: System::String^ str0;private: System::String^ str1;public:         ABC()        {                str0 = "ABCDEFG";        }    System::String^ GetStr()    {        return str1;    }};

执行代码,
C/C++ code
int main(){    ABC^ abc = gcnew ABC();    Console::WriteLine(abc->GetStr());    Console::Read();      // 仅为暂停控制台, 以便查看输出结果.    return 0;}

.
如上代码可以编译运行, 输出结果只有一个换行符.
以此例为基础我有一个问题:
对于ABC类的成员str1, 它在类内的声明就是个跟踪句柄String^, 虽然ABC的构造函数没有对它进行初始化, 但是由输出情况看, str1是可以被引用的. 这是否意味着, 对象abc被构造时, 在CLR堆上, 其跟踪句柄型成员str1被预留(reserve)了内存空间, 并且这块内存空间还被String的默认构造函数给初始化了? 若不是, 那实际情况是什么?

[解决办法]
CLR上声明对象的时候会分配指针和同步块索引(好像是这个词)
在实例化(new)的时候分配成员的内存,并调用构造函数对其初始化;
如果类没有构造函数,会生成一个默认的构造函数。

[解决办法]
不是

Class A {}

A a; 声明
a = new A();实例化
[解决办法]
探讨
我们都知道System::String是个引用类, 所以不得不使用跟踪句柄.
举一个简单的例子:
ABC类的定义,
C/C++ code

public ref class ABC
{
private: System::String^ str0;
private: System::String^ str1;
public:
ABC(
{
……

热点排行