错误:无法在本机堆上动态分配此值类型对象

时间:2015-10-08 18:05:00

标签: c++-cli clr

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

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;
  

错误C3255'System :: DateTime':无法动态分配此值   在本机堆上键入对象

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

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

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

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

2 个答案:

答案 0 :(得分:2)

如果你不需要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。创建&amp; em作为临时用户,使用它们,让堆栈或其他任何管理临时变量的方法都在使用,以便进行清理。您可以指向它们,但不建议这样做。

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

System :: DateTime是一个值结构,因此它推荐使用的是strays。作为指针,System :: DateTime必须用作垃圾收集指针,^代替*,并用gcnew代替new或作为具有已定义范围的变量。

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

DateTime ^ gDate;

分配它需要

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

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

答案 1 :(得分:1)

正如here所解释的那样,您可以在堆栈上创建DateTime,但不能在堆上创建。{/ 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;

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

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