Как избежать временной переменной в операторе подписки - PullRequest
0 голосов
/ 18 октября 2011

У меня есть класс v, который динамически распределяет массив значений типа double. Записи - это указатель на начало этого массива. Интервал позволяет мне пропускать записи, например, если бы я хотел учесть только каждую третью запись, интервал был бы равен 3.

double& v::operator[] (const int n) {
    return entries[n*spacing]; 
}

Этот оператор индексации компилируется, но вызывает повреждение кучи. Основываясь на моих поисках в Интернете, я думаю, что Visual Studio сохраняет результат «records [n * spacing]» во временном хранилище, а затем возвращает ссылку на временный. Повреждение кучи происходит, когда я пытаюсь записать в эту ссылку освобожденную память.

У кого-нибудь есть идеи для обхода?

1 Ответ

0 голосов
/ 18 октября 2011

Я думаю, что Visual Studio сохраняет результат «records [n * spacing]» во временном хранилище, а затем возвращает ссылку на временное.

Это неверно.Предполагая, что entries определено как double entries[]; или double* entries, тогда entries[i] возвращает ссылку и является той ссылкой, которая возвращается вашим оператором индекса.

Источник вашей проблемы находится где-то еще.Возможно, n*spacing находится за пределами массива, или весь entries освобождается к моменту обращения к ссылке.

...