C++中悬垂指针(delete后指针)仍然可以访问所指内存的问题
在指针被delete
之后,此时指针被称为空悬指针或者悬垂指针,即指向一块曾经保存数据对象,但现在已经无效的内存的指针。
在C++编程中,当我们delete
一个指针后,指针所指向的堆地址空间便被释放,指针值变成无效,该内存可以用于之后的内存分配。
但是虽然该指针已经无效,但在很多机器上该指针仍然保存着已经被释放了的动态内存地址(并且内存地址中的值也并未被擦除),因此此时该指针仍然能用于操作这块内存,但这么做是不合理的,也极度不安全。
因此,正确的做法是在使用delete
了一个指针之后,及时将该指针置为nullptr
class Drived {
public:
Drived() { std::cout << "Drived构造函数" << std::endl; }
~Drived() { std::cout << "Drived析构函数" << std::endl; }
void func() {
std::cout << "Drived的func" << std::endl;
}
};
int main() {
Drived* obj = new Drived();
std::cout << obj << std::endl;
obj->func();
delete obj;
obj->func();
std::cout << obj << std::endl;
int* p = new int(2);
std::cout << *p << std::endl;
delete p;
std::cout << *p << std::endl;
return 0;
}
/*
Drived构造函数
0x6aff40
Drived的func
Drived析构函数
Drived的func
0x6aff40
2
7004736
*/
标签:悬垂,所指,C++,内存,指针,delete
From: https://www.cnblogs.com/3to4/p/17738302.html