#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 прошли