Собственный RowVector вне области видимости выдает «Ошибка проверки во время выполнения # 2 — Стек вокруг переменной X был поврежден»

#c #visual-studio #exception #eigen

#c #visual-studio #исключение #eigen

Вопрос:

Я использую собственную библиотеку и получаю это очень странное исключение:

Ошибка проверки во время выполнения # 2 — поврежден стек вокруг переменной ‘myVariableCopy’.

Это из следующего кода:

 void get_new_handle_locations()
{
    int count = 0;
    for (long vi = 0; vi < V.rows();   vi)
    {
        if (handle_id[vi] >= 0)
        {
            Eigen::RowVector3f myVariable = V.row(vi).cast<float>();

            if (handle_id[vi] == moving_handle)
            {
                Eigen::RowVector3f myVariableCopy = myVariable;
                myVariable -= handle_centroids.row(moving_handle).cast<float>();
                igl::rotate_by_quat(myVariable.data(), rotation.data(), myVariableCopy.data());
                myVariable = myVariableCopy;
                myVariable  = handle_centroids.row(moving_handle).cast<float>();
            }

            handle_vertex_positions.row(count  ) = myVariable.cast<double>();
        }
    }
} // This is where the exception is thrown
  

Исключение возникает после завершения цикла, и условие не выполняется для последних ~ 100 итераций, поэтому на этом этапе переменная наверняка должна быть вне области видимости

Я использую VS 2017.

Я подавил это исключение, но есть ли что-то, о чем мне следует беспокоиться, или это ошибка VS?

Комментарии:

1. Я сильно подозреваю, что это происходит потому, что вы пишете в handle_vertex_positions.row(count ) и count можете просто продолжать расти за пределы размера handle_vertex_positions .

2. Я бы не ожидал, что это ошибка в Visual Studio. Более вероятно, что вы повреждаете стек.

3. Хорошо, я думаю, это потому, что goalPositionCopy является трехмерным, а rotate_by_quat вызывает функцию, которая использует его как 4-мерный

Ответ №1:

Причиной повреждения являются igl::rotate_by_quat вызовы igl::quat_mult , которые ожидают goalPositionCopy.data() , что они будут иметь 4 измерения, но они объявлены как трехмерный вектор.

Комментарии:

1. Я рад, что вы получили свое решение, и спасибо, что поделились, я был бы признателен, если бы вы отметили их как ответ, и это будет полезно для другого сообщества.

2. Я могу принять этот ответ только через 48 часов, и только 47 прошли