我正在使用boost库来获取当前系统时间并且我的代码正常工作但是visualt studio 2010在程序之后退出。调试器在尝试释放不存在的指针时中断。我知道这是因为提升本机代码。如果我评论代码的提升部分没有错误。
直到现在我尝试使用MSDN中解释的#pragma但没有成功。有人可以给我一些建议。 (我也尝试过GetSystemTime函数来获取时间,但是我无法获得像boost这样的微秒细节。)
我的代码
#pragma managed(push, off)
void GetSystemDateTime(SDateTime& stimeblock);
#pragma managed(pop)
int main()
{
c++/cli code
SDateTime stimestruct[1];
//call to the function having the boost code..
GetSystemDateTime(stimestruct[0]);
}
功能定义
#pragma managed(push, off)
void GetSystemDateTime(SDateTime& timeblock)
{
// SYSTEMTIME time;
// GetSystemTime(&time);
// WORD millis = (time.wSecond * 1000) + time.wMilliseconds;
boost::posix_time::ptime now = boost::posix_time::microsec_clock::local_time();
std::tm pt_tm = to_tm(now);
std::cout << now << std::endl;
//std::cout << time.wYear<< time.wMonth<<time.wDay //<<time.wHour<<time.wMinute<<time.wSecond<<time.wMilliseconds << std::endl;
std::string timestring = to_iso_string(now);
std::string sYear = timestring.substr (0,4);
std::string sMonth = timestring.substr (4,2);
std::string sDay = timestring.substr (6,2);
std::string sHour = timestring.substr (9,2);
std::string sMinute = timestring.substr (11,2);
std::string sSecond = timestring.substr (13,2);
std::string sUSecond = timestring.substr (16);
istringstream isYear(sYear);
istringstream isMonth(sMonth);
istringstream isDay(sDay);
istringstream isHour(sHour);
istringstream isMinute(sMinute);
istringstream isSec(sSecond);
istringstream isUSec(sUSecond);
// use is like an input stream
int iYear,iMonth,iDay,iHour,iMinute,iSecond,iUSecond;
isYear >> iYear;
isMonth >>iMonth;
isDay >>iDay;
isHour >>iHour;
isMinute >>iMinute;
isSec >>iSecond;
isUSec >>iUSecond;
timeblock.uiYear = iYear;
timeblock.usiMonth = time.wMonth;
timeblock.usiDay = time.wDay;
timeblock.usiHour = time.wHour;
timeblock.usiMinute = time.wMinute;
timeblock.usiSec = time.wSecond;
timeblock.udiUSec = time.wMilliseconds;
// Display version information
}
答案 0 :(得分:2)
我在C ++ / CLI程序集中看到了由using a static variable in native code引起的这个错误。
我发现的唯一解决方法是删除静态变量,例如,将其移动到类或文件范围。
但是,如果此静态变量位于boost代码中,那么这样做可能并不容易/可能。在这种情况下,您可以创建一个单独的C ++文件,该文件在没有/clr
的情况下编译,使用该文件中的boost函数,并将其链接到您的C ++ / CLI程序集。
此错误似乎是由编译器生成错误代码引起的。我filed a bug with Microsoft,已关闭“将无法修复”,但编译器团队在回复中提供了其他一些解决方法。
答案 1 :(得分:0)
尝试使用
#pragma managed(push, off)
#pragma managed(pop)
所有提升头文件的#include
行。
答案 2 :(得分:0)
我现在几天都遇到了同样的问题。
这是我找到的最好的解决方法。并解释了为什么会这样。
查看结尾(编号7和9)
希望这有助于http://www.codeproject.com/Articles/442784/Best-gotchas-of-Cplusplus-CLI