Параметр функции случайно дублирует адрес указателя другого параметра?

#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. На самом деле это полезно знать. Я могу просто отключить оптимизацию во время отладки с помощью кода выпуска.