为何要在unordered_map类型的参数前添加‘&’符号?
为什么不加
&会导致程序崩溃? 嘿,这个问题问到点子上了!咱们一步步拆解背后的原因:
值传递会创建副本,迭代器指向临时对象
当你不给参数intString加&时,函数采用的是值传递——这意味着调用函数时,会把原unordered_map完整复制一份,作为函数内部的局部变量。而intString.find(index)返回的迭代器,是指向这个临时副本内部元素的指针。临时副本销毁后,迭代器变成“悬空迭代器”
函数执行完毕后,内部的局部变量(也就是那个哈希表副本)会被自动销毁,它占用的内存会被系统回收。这时候你返回的迭代器就成了“悬空迭代器”——指向一块已经被释放的无效内存。使用悬空迭代器触发未定义行为
当你在函数外部尝试使用这个返回的迭代器时,程序会去访问已经不属于它的内存空间,这种情况属于C++里的未定义行为,最常见的表现就是程序直接崩溃,当然也可能出现其他诡异的错误(比如数据错乱)。
反过来,当你给参数加上&,就变成了引用传递——函数直接操作原有的unordered_map,返回的迭代器指向的是原容器的有效内存,函数结束后原容器依然存在,迭代器自然能正常使用。
举个更直白的例子:就像你复制了一份文件,然后把这份复制文件的页码给别人,结果转头你就把复制的文件扔了,别人拿着这个页码去找内容,当然找不到,还可能把东西搞乱。而引用传递就相当于直接给别人原文件的页码,原文件一直在那儿,自然没问题。
内容的提问来源于stack exchange,提问作者Sheryl
相关产品推荐
相关产品推荐

