CLR对C++/CLI类内跟踪句柄型字段的初始化策略是什么?解决办法
CLR对C++/CLI类内跟踪句柄型字段的初始化策略是什么?我们都知道System::String是个引用类, 所以不得不使用
CLR对C++/CLI类内跟踪句柄型字段的初始化策略是什么?
我们都知道System::String是个引用类, 所以不得不使用跟踪句柄.
举一个简单的例子:
ABC类的定义,
C/C++ codepublic ref class ABC{private: System::String^ str0;private: System::String^ str1;public: ABC() { str0 = "ABCDEFG"; } System::String^ GetStr() { return str1; }};
执行代码,
C/C++ codeint 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();实例化
[解决办法]