#c #visual-studio-2008 #pointers #managed-c
#c #visual-studio-2008 #указатели #управляемый-c
Вопрос:
Сегодня я столкнулся с довольно странной ошибкой. По сути, то, что происходит внутри функции foo
, первому параметру присваивается значение указателя указателя crosssegments
. Скажем crosssegments
, местоположение в 0x0045 тогда iMeaninglessdata
будет установлено в 0x0045. Если я выну iMeaninglessData
и просто o1
использую в качестве первого параметра, o1
это будет равно 0x0045. Если я приостановлю отладчик до того, как функция будет вызвана iMeaningless
data и crosssegments
будет иметь разные адреса указателей.
void Foo(int *iMeaninglessData, handle o1, handle o2, handle o3, int iHeight, int iProfileHeight, handle o4, std::vector<object> * crossSegments, int *iProfileArray)
{
//...code
}
Вот как я вызываю функцию:
std::vector<FormSummary> * crossSegmentsTop = new std::vector<FormSummary>();
int iZero = 0;
Foo(amp;iZero, o1, o2, o3, 10, 50, o4, crossSegmentsTop, iProfileArray);
Я очень смущен тем, как это могло произойти. Как вы думаете, что-то может происходить со стеком?
Спасибо,
- Alikar
Комментарии:
1. Можете ли вы показать код внутри Foo?
2. Вероятно, вы нарушаете правило единого определения.
3. Вы пробовали выполнить чистую и полную перестройку своего проекта?
Ответ №1:
Оказывается, это ошибка в отладчике Visual studio 2008 при использовании режима выпуска по сравнению с режимом отладки. Я создаю файл PDB, но, по-видимому, пока вы не используете значение, например, в окне командной строки, он неправильно определяет местоположение указателя на переменную.
Комментарии:
1. Это не ошибка; это артефакт процесса оптимизации.
2. Можете ли вы объяснить, что именно происходит с процессом оптимизации, чтобы вызвать это? Есть ли флаг, который я могу отключить или включить, чтобы настроить это?
3. Оптимизация включает в себя потенциальное удаление пространства стека для локальных переменных. Так что нет, не без отключения оптимизации.
4. На самом деле это полезно знать. Я могу просто отключить оптимизацию во время отладки с помощью кода выпуска.