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++ 中的使用视为最佳实践是正确的。
我正在将 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++ 中的使用视为最佳实践是正确的。