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++ 添加了 value
和 ref
结构以及 类 的概念。这些是具有自动生命周期控制的对象。 .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 运行时的垃圾收集器将销毁它。
我正在尝试即时创建 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++ 添加了 value
和 ref
结构以及 类 的概念。这些是具有自动生命周期控制的对象。 .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 运行时的垃圾收集器将销毁它。