gpt4 book ai didi

c++ - 为什么调用 std::map::clear() 后内存仍然可以访问?

转载 作者:IT老高 更新时间:2023-10-28 21:59:54 27 4
gpt4 key购买 nike

我正在观察 std::map::clear() 的奇怪行为。该方法应该在调用时调用元素的析构函数,但是调用 clear() 后仍然可以访问内存。

例如:

struct A
{
~A() { x = 0; }
int x;
};

int main( void )
{
std::map< int, A * > my_map;
A *a = new A();
a->x = 5;
my_map.insert( std::make_pair< int, *A >( 0, a ) );

// addresses will be the same, will print 5
std::cout << a << " " << my_map[0] << " " << my_map[0]->x << std::endl;

my_map.clear();

// will be 0
std::cout << a->x << std::endl;

return 0;
}

问题是,为什么变量 a 在其析构函数被 map::clear() 调用后仍然可以访问?在调用 my_map.clear() 之后是否需要编写 delete a; 或者覆盖 a 的内容是否安全?

提前感谢您的帮助,斯内格

最佳答案

如果您将指针存储在 map (或列表或类似的东西)上,负责删除指针,因为 map 不知道它们是否是用 new 创建的, 或不。如果不使用指针,clear 函数只会调用析构函数。

哦,还有一件事:调用析构函数(甚至调用删除)并不意味着不能再访问内存。这仅意味着如果您这样做,您将访问垃圾。

关于c++ - 为什么调用 std::map::clear() 后内存仍然可以访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/569110/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com