1

我正在使用 boost 库来获取当前系统时间并且我的代码可以工作,但是在程序之后 Visualt Studio 2010 退出。调试器在尝试释放不存在的指针时中断。我知道这是因为 boost 本机代码。因为如果我评论代码的 boost 部分没有错误。

直到现在我尝试使用 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

    }
4

3 回答 3

2

我已经看到由于在 C++/CLI 程序集中的本机代码中使用静态变量而导致的此错误。

我发现的唯一解决方法是删除静态变量,例如,通过将其移动到类或文件范围。

但是,如果这个静态变量在 boost 代码中,那么这样做可能并不容易/不可能。在这种情况下,您可以创建一个单独的 C++ 文件,该文件在没有 的情况下编译/clr,使用该文件中的 boost 函数,并将其链接到您的 C++/CLI 程序集。

此错误似乎是由编译器生成不正确的代码引起的。我向 Microsoft 提交了一个错误,该错误已关闭“无法修复”,但编译器团队在他们的回复中提供了其他一些解决方法。

于 2012-05-04T05:55:54.963 回答
0

尝试使用

#pragma managed(push, off)
#pragma managed(pop)

围绕#include所有 boost 头文件的行。

于 2012-05-04T04:40:05.077 回答
0

我现在在同样的问题上几天了。

这是我发现的最好的解决方法。并解释了为什么会这样。

看看最后(7号和9号)

希望这有助于http://www.codeproject.com/Articles/442784/Best-gotchas-of-Cplusplus-CLI

于 2013-03-17T22:30:00.713 回答