如果在函数内部,我将数据存储在unordered_set中,然后返回指向所存储对象的指针,指针是否仍然在函数范围之外有效?
例如
int *myFunc(){
std::unordered_set<int> hashset;
//add some objects
hashset.insert(4);
hashset.insert(5);
hashset.insert(6);
int *intptr = &(*hashset.insert(4)); //try to insert an object that may already be in the set, and get a pointer to the object in the set
return intptr;
}
会尝试访问另一个函数中的*intptr
会导致错误吗?或者,当unordered_set的范围结束时,unordered_set中的数据是否已释放?
答案 0 :(得分:3)
是的,在您的示例中,您将返回一个对象,该对象在调用unordered_set
的析构函数时已被销毁,即函数退出其范围时。
即使unordered_set
中包含的元素是动态分配的(并且元素是指包含有效键或值的对象),它们也会在集合本身被销毁时被销毁。
在实践中,您可以访问数据并且不会收到任何错误但是您不应该考虑这种情况,因为它只是不安全。只考虑它是错误的。
为了获得你需要的东西,你应该自己处理集合中包含的对象的内部初始化。 unique_ptr<int>
可以做到这一点,因为返回值会在销毁集合时移动它并阻止对象被释放。
答案 1 :(得分:2)
简短回答是肯定的。
调用函数后,hashset对象中的内存应视为无效。因此,返回指向该对象内部的指针将具有未定义的行为。
答案可能更长。
但是,在函数返回后的一段时间内,该内存的状态可能会保持不变。因此,尽管内存无效,您仍可从代码中获得“正确”的结果。
最长的答案取决于。
如何处理内存将在很大程度上取决于您运行的平台。内存受限的系统可能会执行与桌面有很大不同的内存管理。