2014-11-11 4 views
-1

Кажется, что при возврате я получаю коррумпированные значения. Изображение иллюстрирует вывод цикла.Метод, возвращающий поврежденные значения

enter image description here

// loop 
float *bo = getBoundaries(); // this calls the method displayed below 
cout << "\ngetDisplay: " << bo[0]; 
// loop 

float* getBoundaries() 
{ 
    cout << "\ngetB: " << x1; // this displays the correct value 
    float boundaries[4] = {}; 
    boundaries[0] = x1; 
    boundaries[1] = x2; 
    boundaries[2] = y1; 
    boundaries[3] = y2; 
    cout << "\nfinal: " << boundaries[0]; // this also displays the correct value 
    return boundaries; 
} 

Это случилось, когда я был переход от отладки в режим выпуска, однако он теперь влияет как отладки и выпуска.

+1

Скомпилируйте свои программы, все предупреждения будут включены, вы должны получить предупреждение о возврате ссылки на временную. – shuttle87

+2

Используйте 'std :: vector ' вместо 'float *', и ваша проблема исчезнет. – PaulMcKenzie

+2

Или, для небольшого массива фиксированного размера, 'std :: array '. –

ответ

4
return boundaries; 

Использование указателя на локальную функцию, выходящую за пределы области действия, является неопределенным поведением. Когда возвращается getBoundaries(), локальное значение boundaries выходит за пределы области видимости, и поэтому разыменование возвращаемого указателя может сделать что угодно, включая сбой программы.

Так как массивы не могут быть возвращены по значению, но Структуры может, один вариант будет возвращать структура, содержащая массив:

struct boundaries { 
    float v[4]; 
}; 

boundaries getBoundaries() { 
    boundaries b; 

    b.v[0] = x1; 
    b.v[1] = x2; 
    b.v[2] = y1; 
    b.v[3] = y2; 

    return b; 
} 

// Then in your loop: 
boundaries bo = getBoundaries(); 
cout << "\ngetDisplay: " << bo.v[0]; 

Вы также можете вернуться std::vector<float>, или (если у вас есть C++ 11) то лучшим вариантом будет std::array<float, 4>.

+0

Хм, как это объяснит это, прежде чем я что-нибудь изменил? –

+0

@KarlMorrison Ничто в этом ответе не исключает возможности того, что он будет работать так, как вы планировали. «Неопределенное поведение» означает, что все может случиться, * включая * программу, которая работает так, как вы планировали. Вероятно, что код-ген до этого не коснулся пространства, выделенного в стеке для «границ», но когда вы что-то изменили, это пространство стека снова используется внутри функции, содержащей цикл, поэтому данные там сбивается, прежде чем у вас есть шанс прочитать его. Если UB делает то, что вы намереваетесь, тогда казалось бы безобидное изменение может внезапно заставить его сломаться. UB плохой. – cdhowie

+0

Массив исправил все! Я буду использовать его с этого момента. –

Смежные вопросы