Еще раз я понял, что функция должна возвращать правильное значение, а затем разочаровываться ... получая странное поведение и вводя в заблуждение информацию отладки. Хорошо известно, что вы не можете вернуть локальную переменную из функции и ожидать, что она прибудет так, как вы ожидаете. Тестирование
int i=2;
int k=4;
return make_pair<int,int>(i*i,k*k);
Действительно ли возвращает что-то респектабельное. Но использование более сложных объектов, чем простые типы, кажется, ловит меня каждый раз . Итак, есть ли формальность, которую я могу использовать для различения того, что можно, а что нельзя безопасно вернуть из функции? ----------- добавлено при редактировании: ------------ Вот пример, который не работает, зверски вырван из контекста. Проблемный контекст - это (должно быть GUI) дерево прямоугольников для экрана. Узел класса наследуется от базы (прямоугольника), содержащей 3 указателя, на простые типы (опять же, используется для привязки значений). База использует конструктор new в конструкторе
pair<node,node> node_handler::split( vector<node>::iterator& this_node, double ratio, bool as_horizontal ){
//this_node becomes parents to the split-twins
this_node->my_ratio=ratio;
double firstW, firstH;
double secW, secH;
glm::dvec2 afirst, asecond;
if(as_horizontal ){
firstW = *this_node->plWidth*LETTER_PIXEL_WIDTH;
firstH = *this_node->plHeight*LINE_PIXEL_HEIGHT*ratio;
afirst = *this_node->pPoint;
secW = firstW;
secH = LINE_PIXEL_HEIGHT*(*this_node->plHeight)*(1.0d-ratio);
asecond= afirst+glm::dvec2(0.0d, firstH);
}
else{
firstW = ratio*(*this_node->plWidth)*LETTER_PIXEL_WIDTH;
firstH = *this_node->plHeight*LINE_PIXEL_HEIGHT;
afirst = *this_node->pPoint;
secW = (1.0d*ratio)*(*this_node->plWidth)*LETTER_PIXEL_WIDTH;
secH = firstH;
asecond= afirst+glm::dvec2(firstW,0.0d);
}
return make_pair<node,node>( node(afirst ,firstW, firstH) , node(asecond ,secW, secH) ) ;
}