Вы возвращаете указатель на локальный массив. Как только ControlerCore::GetReport
возвращается, buf
выходит из области видимости и уничтожается. Любая попытка получить к нему доступ после этого приводит к неопределенному поведению.
Вам нужно заставить Report
фактически хранить данные напрямую. Самый простой способ - использовать std::vector
:
struct Report
{
std::vector<unsigned char> data;
// don't need dataLength anymore since std::vector knows its size
};
Report ControllerCore::GetReport() {
Report report;
report.data.resize(256);
int res = 0;
while (res == 0) {
res = get_data(report.data.data(), report.data.size());
}
report.data.resize(res);
return report;
}
Теперь, когда Report
имеет только одного члена, он, вероятно, больше не нужен, и вы можете просто вместо этого вернуть std::vector<unsigned char>
.
Если вы хотите избежать динамического выделения, используемого std::vector
, вы можете вместо этого использовать std::array
(или необработанный массив):
struct Report
{
std::array<unsigned char, 256> data;
size_t dataLength; // back now, since the length of the data won't match the size of the contianer
};
Report ControllerCore::GetReport() {
Report report;
int res = 0;
while (res == 0) {
res = get_data(report.data.data(), report.data.size());
}
report.dataLength = res;
return report;
}
Это позволяет избежать динамического выделения, но требует дополнительной копии данных, поскольку std::array
не может быть эффективно перемещен, как std::vector
. Это означает, что если динамическое распределение не будет особенно медленным на вашей платформе, версия std::vector
, вероятно, будет быстрее.