Error: cannot dynamically allocate this value type object on native heap

Error: cannot dynamically allocate this value type object on native heap

我正在尝试即时创建 System::DateTime 的实例并将其分配给 System::DateTime gDate 以防用户使用 'P' 参数。但是,我收到代码片段后显示的错误。

case 'P':
  gDate=new DateTime(std::stoi(year), std::stoi(month), std::stoi(day));            
  cout << "Persian Date is: " << pDate.GetDayOfMonth(gDate) << "/" <<
       pDate.GetMonth (gDate) << "/" << pDate.GetYear(gDate) << endl;
  break;

Error C3255 'System::DateTime': cannot dynamically allocate this value type object on native heap

错误的原因是什么,我应该如何预防?

更新:
我可能应该首先说,我也尝试了以下定义:

DateTime gDate(std::stoi(year), std::stoi(month), std::stoi(day));          

但是,我收到错误,Error C2360 initialization of 'gDate' is skipped by 'case' label

here 所述,您可以在堆栈上创建 DateTime,但不能在堆上创建。

这样试试:

DateTime gDate(std::stoi(year), std::stoi(month), std::stoi(day));          
cout << "Persian Date is: " << pDate.GetDayOfMonth(gDate) << "/" <<
     pDate.GetMonth (gDate) << "/" << pDate.GetYear(gDate) << endl;
break;

或者,您可以使用 gcnew 分配托管内存:

DateTime^ gDate = gcnew DateTime(std::stoi(year), std::stoi(month), std::stoi(day));

如果您不需要 gDate 作为指针,而且您几乎肯定不需要,请尝试:

 case 'P':
     {
         DateTime gDate(std::stoi(year), std::stoi(month), std::stoi(day));          
         cout << "Persian Date is: " << pDate.GetDayOfMonth(gDate) << "/" <<
                  pDate.GetMonth (gDate) << "/" << pDate.GetYear(gDate) << endl;
     }
     break;

大括号为 gDate 建立了一个作用域,确保在程序退出大括号时删除。

CLI/CLR C++ 是不同于 C++ 的野兽,并且具有一些不同的语义。

CLI/C++ 添加了 valueref 结构以及 类 的概念。这些是具有自动生命周期控制的对象。 .Net 运行时,而不是程序员,决定他们何时生死,这需要不同的语法。

那些标记为 value 的目的是用作像 int 或 double 这样的普通旧数据类型。将它们创建为临时变量,使用它们,并让堆栈或正在使用的任何其他管理临时变量的方法负责清理工作。可以指向,但不推荐。

ref 结构和 类 在设计时考虑了引用使用,并且是指针的开放游戏,只要它们是垃圾收集指针。

System::DateTime 是一个值结构,因此后面的内容偏离了它的推荐用法。作为指针,System::DateTime 必须用作垃圾收集指针,用 ^ 代替 * 并用 gcnew 代替 new 分配,或者用作具有定义范围的变量。

如果 gDate 必须是指针,则必须定义它

DateTime ^ gDate;

分配它需要

gDate = gcnew DateTime(std::stoi(year), std::stoi(month), std::stoi(day));  

当没有对该分配对象的进一步引用时,gDate 和 gDate 的任何副本都超出范围,.Net 运行时的垃圾收集器将销毁它。