space 是否必须分配给 ProcessStartInfo?

Does space have to be allocated to ProcessStartInfo?

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

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

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

谢谢。

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

如您所述,当您使用关键字 new.[=16= 调用 ProcessStartInfo obj 的构造函数时,.Net 运行time env 会为您分配内存]

这就是表达式"managed .Net CLR languages"的核心意思。

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

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

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

现在,在 C++ 中,新分配的内存始终未初始化(相反 "managed" 语言总是分配内存已初始化),因此开发人员始终在“时”初始化每个新变量(值类型或对象) defined"(已分配),在 C++ 中 memset 函数执行此操作。

因此,将您提到的 memset 在 C++ 中的使用视为最佳实践是正确的。