Переполнение буфера — не могу найти проблему

Я пытаюсь найти проблему в этом простом примере кода, который выдает «Предупреждение о переполнении буфера», и, посмотрев на него некоторое время, я решил опубликовать это в надежде, что кто-то увидит ошибку в моем коде?

Сообщение: Предупреждение C6386 Переполнение буфера при записи в ‘tmpArray’: размер записи равен ‘line.public: unsigned int __thiscall std :: basic_string, класс std :: allocator> :: length (void) const () * 12 * 4’ байтов, но ‘ 52 байта могут быть записаны.

Пример, который выдает предупреждение:

#define STEP 12

void main()
{
std::string line("Hello!");

float* tmpArray = new float[line.length() * STEP];

unsigned int v = 0;

for (unsigned int i = 0; i < line.length(); i++)
{
tmpArray[  v  ]  = 0.0f;
tmpArray[v + 1]  = 0.0f;
tmpArray[v + 2]  = 0.0f;
tmpArray[v + 3]  = 0.0f;
tmpArray[v + 4]  = 0.0f;
tmpArray[v + 5]  = 0.0f;
tmpArray[v + 6]  = 0.0f;
tmpArray[v + 7]  = 0.0f;
tmpArray[v + 8]  = 0.0f;
tmpArray[v + 9]  = 0.0f;
tmpArray[v + 10] = 0.0f;
tmpArray[v + 11] = 0.0f;

v += STEP;
}

delete[] tmpArray;
}

Я не вижу, куда я вхожу в память, которая не принадлежит tmpArray, я имею в виду, что буфер распределяется точно на основе тех же значений, что и длина строки и размер шага.

1

Решение

Благодаря aschepler, который прокомментировал выше, решение этой проблемы оказалось скопировать значение, возвращаемое .length () в const unsigned int, а затем использовать его в обоих местах, например так:

const unsigned int lineLength = line.length();

Распределение:

float* tmpArray = new float[lineLength * STEP];

Для цикла:

for (unsigned int i = 0; i < lineLength; i++)
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]