是否必须将空间分配给ProcessStartInfo?

时间:2016-11-16 13:24:19

标签: c# memory-management managed processstartinfo

我正在将C ++代码移植到C#,我在C ++代码中遇到了这个代码,

SHELLEXECUTEINFO shell;
memset(&shell, 0, sizeof(shell));
//the properties in shell are set
ShellExecuteEx(&shell);

所以现在我使用Process.Start()ProcessStartInfo作为C#代码。我是否必须为ProcessStartInfo分配内存,还是在调用ProcessStartInfo构造函数时为我完成的内存?只是为了满足我的好奇心,这种在C ++中使用memset的方式是一种非托管语言的练习还是我不正确地理解了什么?

谢谢。

2 个答案:

答案 0 :(得分:6)

由于C#是托管语言,因此在创建ProcessStartInfo对象时不必显式提供内存。

答案 1 :(得分:2)

正如您所说,当您使用关键字ProcessStartInfo调用new obj的构造函数时,.Net运行时环境会为您分配内存。

这是表达"托管.Net CLR语言的核心含义"。

你的另一个问题的答案是:是的。

所谓的"非管理"语言为C ++,或更好的所有语言,以及C ++的内存管理负责开发人员和编译器,他们不会初始化已分配的内存,在实例化或调用对象构造函数后,初始化分配的内存,否则其内容会很脏并且可能导致运行时错误。

在你的特定情况下,你没有调用构造函数,因为你有一个struct或值类型变量,所以SHELLEXECUTEINFO shell;语句不是一个简单的声明,但它是一个真实的&# 34; 变量定义",即此语句导致内存分配。

现在,在C ++中,新分配的内存总是没有初始化(而是"托管"语言总是分配内存初始化),因此开发人员总是初始化每个新变量(值类型或对象)时" 定义" (已分配),并在C ++ memset函数中执行此操作。

因此,将您在C ++中提及的memset用作最佳实践是正确的。