当函数结束时,std :: unordered_set中的数据是否被删除?

时间:2014-06-06 23:22:07

标签: c++ unordered-set

如果在函数内部,我将数据存储在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中的数据是否已释放?

2 个答案:

答案 0 :(得分:3)

是的,在您的示例中,您将返回一个对象,该对象在调用unordered_set的析构函数时已被销毁,即函数退出其范围时。

即使unordered_set中包含的元素是动态分配的(并且元素是指包含有效键或值的对象),它们也会在集合本身被销毁时被销毁。

在实践中,您可以访问数据并且不会收到任何错误但是您不应该考虑这种情况,因为它只是不安全。只考虑它是错误的。

为了获得你需要的东西,你应该自己处理集合中包含的对象的内部初始化。 unique_ptr<int>可以做到这一点,因为返回值会在销毁集合时移动它并阻止对象被释放。

答案 1 :(得分:2)

简短回答是肯定的。

调用函数后,hashset对象中的内存应视为无效。因此,返回指向该对象内部的指针将具有未定义的行为。

答案可能更长。

但是,在函数返回后的一段时间内,该内存的状态可能会保持不变。因此,尽管内存无效,您仍可从代码中获得“正确”的结果。

最长的答案取决于。

如何处理内存将在很大程度上取决于您运行的平台。内存受限的系统可能会执行与桌面有很大不同的内存管理。