Как избежать временной переменной в операторе подписки

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

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

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

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

1 ответ

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

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

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

Другие вопросы по тегам