指向动态容器的指针是否持续存在?
Does Pointer to Dynamic Container Persist?
我知道向量、列表、映射和集合等动态数据结构会自动在堆上分配它们的元素,因此如果数据结构被修改,我不能使用指向元素的指针并期望它保持有效。但是我可以指向结构本身并知道它始终有效吗?我会假设该结构在堆栈中有某种锚点,无论其元素分配在哪里,它总是具有相同的地址或其他东西......?
那么,我可以安全地使用 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 我不能依赖它。
您对指针的使用是安全的。只要 s
还活着,指针就有效。在这种情况下,s
将一直存活到函数结束。
我知道向量、列表、映射和集合等动态数据结构会自动在堆上分配它们的元素,因此如果数据结构被修改,我不能使用指向元素的指针并期望它保持有效。但是我可以指向结构本身并知道它始终有效吗?我会假设该结构在堆栈中有某种锚点,无论其元素分配在哪里,它总是具有相同的地址或其他东西......?
那么,我可以安全地使用 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 我不能依赖它。
您对指针的使用是安全的。只要 s
还活着,指针就有效。在这种情况下,s
将一直存活到函数结束。