【发布时间】:2020-01-17 14:04:57
【问题描述】:
我又一次因为期望一个函数返回一个正确的值而感到失望……相反,我得到了奇怪的行为和误导性的调试信息。 众所周知,您不能从函数返回局部变量并期望它按预期到达。测试
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) ) ;
}
【问题讨论】:
-
这是一个非常模糊的问题,但通常您返回 按值 的任何内容都可以。如果返回指针或引用,则该对象的生命周期必须比本地函数长。
-
所以你展示了你说工作的代码,你说你没有展示的其他一些代码不起作用?显示不起作用的代码。
-
“你不能从一个函数返回一个局部变量并期望它如你所愿地到达”——这是完全错误的。
-
Pete Becker,我对它不起作用并不感到惊讶,但不是为什么(直到现在)。我关注了构造函数和析构函数,并注意到 pair 在构造后立即被破坏......并且在此之后执行将停止。
-
如果上面的示例导致执行停止而没有指向失败的特定代码行,我是否应该假设节点的默认复制构造函数不足?