【问题标题】:Does an external pointer reference to a field of a deleted struct makes the pointer refers to garbage values in C++?对已删除结构的字段的外部指针引用是否使指针指向 C++ 中的垃圾值?
【发布时间】:2019-04-20 07:51:30
【问题描述】:

我对 C++ 中的结构释放和指针使用有一个基本的疑问。

假设我有以下场景:

...
struct B
{
    ...
    struct A a_field;
    ...
}
...
struct A* a_ref;
vector<struct B> b_vec;
...
// populate, use and modify b_vec elements here
...
a_ref = &(b_vec[i].a_field); // can be a one-time assignment
...
// deallocate b_vec elements here (including b_vec[i]) here
...
// using a_ref->some_field here !?!
...

a_ref 是否仍将指向 b_vec[i]a_field 的最后修改状态,使其可靠以供以后使用?

或者当将b_vec[i] 推出向量时,C++-STL 释放会使所有字段不可靠(垃圾值)?

【问题讨论】:

  • 1) C++ 没有垃圾收集器。 2) 如果您持有一个指向向量元素的指针并且该向量被销毁,那么您的指针现在悬空。取消引用指针是未定义的行为和一个可怕的错误。
  • 哦,请原谅我对垃圾收集部分一无所知。我期望某种对内存块的隐式引用计数可以保护它免受悬空场景的影响。但我明白你在说什么。谢谢。
  • 也许您实际上是在询问 C#(具有垃圾收集器)?另请注意,在 C++ 中,指针和引用是两个独立的概念,因此 a_ref 实际上并不是引用。
  • 当我有这个疑问时,我正在编写一些 C++ 代码(谢天谢地,我在某些时候肯定会遇到错误)。到目前为止,我还没有真正研究过 C#,但很高兴知道那里的情况。
  • 是的,@VTT。我知道 C++ 中指针和引用之间的概念差异。并且还了解 a_ref 根据我的问题确实是一个指针。感谢您指出了这一点。我已经相应地编辑了我的问题。

标签: c++ pointers vector reference


【解决方案1】:

如果您持有指向std::vector 元素的指针,则该指针可以通过多种方式失效。例如,如果std::vector 被销毁,或者std::vector 在增长时需要重新分配内存。

取消对悬空指针的引用是未定义的行为。这是一个逻辑错误,必须避免。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-26
    • 2021-07-14
    • 2010-09-08
    • 2013-12-06
    • 1970-01-01
    • 2013-01-04
    • 2010-09-25
    • 1970-01-01
    相关资源
    最近更新 更多