小编jgx*_*jgx的帖子

这是一个微软的VC++ 2010编译器错误"new auto(enum_type)"

环境:Microsoft Visual Studio 2010 SP1 SP1 Preminum(10.0.40219.1 SP1Rel),Windows XP SP3

VC10编译器支持auto关键字,但推导出的类型相关信息似乎并不总是正确的枚举.

例:

#include <type_traits>

enum fruit_t
{
    apple = 100,
    banana = 200,
};

int main()
{
    const auto pa = new auto(banana);
    const auto pb = new fruit_t(banana);
    static_assert(std::is_same<decltype(pa), decltype(pb)>::value, "not same!");
    delete pb;
    delete pa;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码应该没有编译时错误或运行时错误.但让我感到惊讶的是,它编译好没有任何错误或警告,但是没有正确运行.调试器在退出main函数后告诉:

HEAP CORRUPTION DETECTED:%hs阻止(#55)在0x00034878.CRT检测到应用程序在堆缓冲区结束后写入内存.

所以我猜编译器可能在"自动"类型扣除中有错误.下面的汇编程序窗口显示,第一个"operator new"调用中请求的内存大小为1个字节,而第二个"operator new"为4个字节.它表明编译器在推断类型的大小上犯了很大的错误.

您认为这是编译器错误吗?微软是否有任何错误修复?

int main()
{
004113C0  push        ebp  
004113C1  mov         ebp,esp  
004113C3  sub         esp,10Ch  
004113C9  push        ebx  
004113CA  push        esi  
004113CB  push        edi  
004113CC  lea         edi,[ebp-10Ch] …
Run Code Online (Sandbox Code Playgroud)

c++ enums visual-c++ auto c++11

6
推荐指数
1
解决办法
344
查看次数

为什么QueryPerformanceCounter和GetTickCount没有跟上节奏?

当我想编写像此平台上不存在的GetTicketCount64这样的函数时,Windows XP下会出现问题.这是我的测试代码:

uint64_t GetTickCountEx()
{
#if _WIN32_WINNT > _WIN32_WINNT_WINXP
    return GetTickCount64();
#else
    // http://msdn.microsoft.com/en-us/library/windows/desktop/dn553408.aspx
    LARGE_INTEGER Frequency = {};
    LARGE_INTEGER Counter = {};
    BOOST_VERIFY(QueryPerformanceFrequency(&Frequency));
    BOOST_VERIFY(QueryPerformanceCounter(&Counter));

    return 1000 * Counter.QuadPart / Frequency.QuadPart;
#endif
}

for (int i = 0; ++i < 1000; Sleep(30000))
{
    const auto utc = time(nullptr); // System time
    const auto xp = GetTickCount(); // API of Windows XP SP3
    const auto ex = GetTickCountEx(); // Performance counter
    const auto diff = ex - xp;
    printf("%lld %I32u %I64u %I64u …
Run Code Online (Sandbox Code Playgroud)

windows timing

2
推荐指数
1
解决办法
3022
查看次数

标签 统计

auto ×1

c++ ×1

c++11 ×1

enums ×1

timing ×1

visual-c++ ×1

windows ×1