我知道动态数据结构(如向量,列表,映射和集合)会自动在堆上分配它们的元素,因此,如果数据结构被修改,我无法获取指向元素的指针并期望它保持有效。但是,我可以指向结构本身,并知道它将始终保持有效吗?我会假设结构在堆栈中有某种锚,它总是有相同的地址或其他东西,无论它的元素分配在哪里......?
所以,我可以使用STL动态容器安全地做这样的事情吗?
int main()
{
std::set<int> s;
std::set<int>* s_ptr = &s;
for (int i = 0; i < 1000000; ++i)
{
s.insert(i);
}
std::cout << s_ptr->size() << std::endl;
}
在我的测试中,这确实有效。但由于UB,我不能依赖它。
答案 0 :(得分:3)
您对指针的使用是安全的。只要s
处于活动状态,指针就会有效。在这种情况下,s
将一直存在,直到函数结束。