【问题标题】:Does space have to be allocated to ProcessStartInfo?是否必须为 ProcessStartInfo 分配空间?
【发布时间】:2016-11-16 13:24:18
【问题描述】:

我正在将 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 的方式是一种非托管语言的实践还是我理解错误?

谢谢。

【问题讨论】:

    标签: c# memory-management managed processstartinfo


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

      所谓的“非托管”语言,如 C++,或者更好的是所有与 C++ 一样具有内存管理的语言,负责不初始化分配内存的开发人员和编译器,在实例化或调用对象构造函数之后,初始化分配的内存,否则它的内容将是脏的,并可能导致运行时错误。

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

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

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

      【讨论】:

      • 谢谢。这是一个非常彻底的答案。
      猜你喜欢
      • 2012-11-26
      • 1970-01-01
      • 2015-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-25
      • 2011-02-22
      • 2018-06-03
      相关资源
      最近更新 更多