处理声明

时间:2011-06-10 16:51:42

标签: c++-cli handles

任何人都可以告诉我这两行代码之间有什么区别,哪一个更好用?

    System::String ^MyStr = gcnew System::String(MyStr); 

    System::String ^MyStr; 

2 个答案:

答案 0 :(得分:2)

这些行不等同。在第一个中,你会得到一个例外,因为你试图从未初始化的跟踪句柄(MyStr)创建一个String。在第二个中,MyStr被声明,未定义,它指向垃圾并且如果您尝试使用它将抛出异常。您应该使用哪一个取决于代码的其余部分

答案 1 :(得分:0)

第二个创建一个新的句柄变量。如果它是一个局部变量,那么正如@dario_ramos所说,它是未初始化的,如果你在分配之前尝试使用句柄,你的程序可能会崩溃。如果它是成员变量或全局变量,那么它将是nullptr

第一个是类似的,虽然它只能用于本地或全局(成员变量使用C ++ / CLI中的 ctor-initializer 语法,就像普通的C ++一样),并且完全与你有关'不允许这样做。它读取全新的未初始化句柄并将其传递给System::String构造函数。如果构造函数偶然完成,则新构造的String的句柄将作为初始化的一部分放入变量中。但是因为构造函数试图制作随机垃圾的副本(如果它是本地的)或nullptr(如果是全局的),很可能它只会崩溃。

在自己的初始化程序中使用任何变量的值是个坏主意(有时你需要使用地址,而不是值)。