new[] 一个包含构造函数的字节对象数组没有错,对吧?



在我的基于物理的渲染器中,我遇到了内存损坏错误(程序崩溃,调试器给出了毫无价值的虚假堆栈跟踪)。我把它追溯到这个SSCCE上。 与构造函数的行似乎是触发错误的原因:

#include <cstdint>
class Foo final {
    public:
        uint8_t packed;
    public:
        inline Foo(void) : packed(0xFF) {} //causes error
        inline ~Foo(void) = default;
};
static_assert(sizeof(Foo)==sizeof(uint8_t),"Implementation error!");
int main(int /*argc*/, char* /*argv*/[]) {
    Foo* arr = new Foo[4]; //Tried a bunch of different sizes.  All fail.
    delete [] arr;
    return 0;
}

MSVC 或 GCC 不会出现此问题,只有英特尔编译器(版本为 16.0)出现。 但是,由于这是一个内存损坏错误,因此这并不意味着什么。 在我提交错误报告之前,有人可以确认这不是我滥用C++吗?


这是演示问题的预制解决方案。 这是程序集。

正如注释中所确定的,通过一系列越来越简单的示例(和相应的编辑),这是完全有效的C++代码。

我在英特尔的开发者论坛上发布了错误报告,并已得到官方确认。

最新更新