1

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

4

2 回答 2

3

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

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

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

要获得您需要的内容,您应该自己处理集合内包含的对象的内部初始化。Anunique_ptr<int>可以做到这一点,因为返回值会在破坏集合时移动它并防止对象被释放。

于 2014-06-06T23:29:16.933 回答
2

简短的回答是肯定的。

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

更长的答案是也许。

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

最长的答案是视情况而定。

内存的处理方式很大程度上取决于您运行的平台。内存受限的系统执行内存管理的方式可能与桌面非常不同。

于 2014-06-06T23:28:02.140 回答