繁体   English   中英

C ++有问题的代码段

[英]C++ problematic code piece

下周我们提供了一份练习表进行测试,以学习一些C ++(此处仍然是初学者)。 我仍然不知道一个简单的问题。

也就是说,为什么这些代码片段会带来问题?

 int& p(int z) { return  z; }
 int* h(int z) { return &z; }

调用int *h(int z) {return &z} ,传递给函数的参数将复制到名为z的变量中。 该副本仅持续与该功能一样长的时间。 因此,一旦函数返回,程序将不再可用。 因此,一旦函数返回,您将没有指向它的有效指针:正式&z无效。

参考版本int &p(int z) {return z}

作为练习,看看您是否能弄清楚如果z本身是一个引用会发生什么情况:即int &p(int& z) {return z} 然后,将不会获得副本。 但请注意,没有专业人员会编写这样的函数。

返回值的行为是不确定的。这里的棘手事情是,如果您通过某种操作(例如,打印到std输出或断言)来测试函数,则可能会经常获得预期的结果,但这并不意味着之所以安全,是因为返回的值指向写入堆栈的值,该值可以在函数返回后的任何给定时刻被擦除(这称为堆栈展开)。 因此,经验法则是,除非将其定义为静态的,否则不要返回该地址或对函数的局部定义变量的引用;为什么在现实世界中,除非情况迫使您这样做,否则还是更希望这样做? :-)

这两个代码段都将引用(或第二种情况下的指针)传递给临时。 考虑例如p(18) 18实际存储在哪里? 那么p(18)应该指向哪里?

旁注:如果所有内容均为const,则代码正常,即。

int const & p(int const & input) { return input; }

该标准将保证这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM