В моем физическом рендерере я получаю ошибку повреждения памяти (программа вылетает, а отладчик дает фиктивный стек стека, который бесполезен). Я проследил это до 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 - это сборка.
Можете ли вы предоставить более подробную информацию о повреждении памяти - это любое значение, есть ли какой-либо шаблон для коррупции, он разбивает ваше приложение или просто предоставляет странные данные и т. Д.? Я не вижу ничего, что могло бы привести к повреждению памяти, но я не являюсь экспертом в объявлениях битовых полей в C++. Пока ваш static_assert имеет значение true, ваш класс должен правильно упаковывать биты. Кроме того, можете ли вы преобразовать бит-упакованную структуру в не упакованные int и убедиться, что она не является ошибкой? –
У вас также есть коррупция, если вы выделяете меньше элементов 32767, может быть, всего 10 или 20? Я полагаю, вы получили ошибку повреждения памяти во время 'delete' ?. –
@MattJordan Я резко упростил этот пример. К сожалению, повреждение памяти - это просто крах. Это очень сложно отлаживать, потому что отладчик ничего не говорит. – imallett