c++ - 为什么我可以在列表中删除对象后访问其成员变量?

标签 c++ erase stdlist

#include <list>
#include <iostream>

struct Foo
{
    Foo(int a):m_a(a)
    {}
    ~Foo()
    {
        std::cout << "Foo destructor" << std::endl;
    }
    int m_a;
};

int main( )
{
   std::list<Foo> a;
   Foo b(10);
   std::cout << &b << std::endl;
   a.push_back(b);
   Foo* c = &(*a.begin());
   std::cout << c << std::endl;
   a.erase(a.begin());
   std::cout << a.size() << std::endl;
   c->m_a = 20;
   std::cout << c->m_a << std::endl;
   std::cout << b.m_a << std::endl;
}

结果是:

0x7fff9920ee70
0x1036020
Foo destructor
0
20
10
Foo destructor

我通常认为在删除列表中的一个对象后我不能再访问thar 对象的成员变量。但是在上面我仍然可以访问 c->m_a 在我删除了 c 指向的对象之后,为什么?

最佳答案

使用 Foo* c = &(*a.begin()); 您创建了一个指向您有意销毁的对象的指针(通过 erase() ).然而,对象的内存仍然存在(因为这是一个非常简单的应用程序,并且操作系统没有为其他东西声明它)。

因此,您可以有效地使用不再属于您的内存。

关于c++ - 为什么我可以在列表中删除对象后访问其成员变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21854374/

相关文章:

c++ - vector 迭代器不是增量 .erase()

vba - 如何删除包含对象和数字的多维变量数组

c++ - 在action book并发中使用split reference count实现lock free stack

c++ - 在一系列 char* 缓冲区中寻找序列号?

c++ - 多重继承的麻烦。如何调用基函数?

c++ - 如何在函数调用(不是作为工具提示而是实际编写)或声明中显示函数参数名称

c++ vector::erase with class object iterator 不删除 vector 成员

c++ - std::prev 和 std::next 对 std::list 的有效性

c++ - 通过引用从 std::list 中移除元素

c++ - 容器超出范围和内存管理