2016-03-17 4 views
11

В моем физическом рендерере я получаю ошибку повреждения памяти (программа вылетает, а отладчик дает фиктивный стек стека, который бесполезен). Я проследил это до 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, только Intel Compiler (версия которого 16,0). Но, поскольку это ошибка памяти, это ничего не значит. Прежде чем я отправлю отчет об ошибке, может ли кто-нибудь подтвердить это, я не злоупотребляю C++?


Here - это готовое решение, демонстрирующее проблему. Here - это сборка.

+1

Можете ли вы предоставить более подробную информацию о повреждении памяти - это любое значение, есть ли какой-либо шаблон для коррупции, он разбивает ваше приложение или просто предоставляет странные данные и т. Д.? Я не вижу ничего, что могло бы привести к повреждению памяти, но я не являюсь экспертом в объявлениях битовых полей в C++. Пока ваш static_assert имеет значение true, ваш класс должен правильно упаковывать биты. Кроме того, можете ли вы преобразовать бит-упакованную структуру в не упакованные int и убедиться, что она не является ошибкой? –

+0

У вас также есть коррупция, если вы выделяете меньше элементов 32767, может быть, всего 10 или 20? Я полагаю, вы получили ошибку повреждения памяти во время 'delete' ?. –

+0

@MattJordan Я резко упростил этот пример. К сожалению, повреждение памяти - это просто крах. Это очень сложно отлаживать, потому что отладчик ничего не говорит. – imallett

ответ

5

Как установлено в комментариях, в серии более простых примеров (и соответствующих изменений) это вполне допустимый код на C++.

Я отправил a bug report на форум разработчиков Intel, и он был официально подтвержден как таковой.