首页 > 系统相关 >C++中悬垂指针(delete后指针)仍然可以访问所指内存的问题

C++中悬垂指针(delete后指针)仍然可以访问所指内存的问题

时间:2023-09-30 22:13:51浏览次数:33  
标签:悬垂 所指 C++ 内存 指针 delete

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

相关文章

  • C/C++中的ACM题目输入处理——简单易上手
    这里就不按其他文章的以各种情况为分类方法,而是以方法本身为分类办法。因为有一些方法是不同情况通用的,比如已知数量数字的输入和未知数量数字的输入,其实可以用同一种办法。输入C/C++:scanf正则表达式头文件<stdio.h>或<cstdio>普通使用时,语法为scanf("%d",&a),当遇到空格符、......
  • C++ 转换构造函数
    在C++中如果一个构造函数只有一个参数,那么这个构造函数就是转换构造函数(ConvertingConstructor),这个构造函数可以将参数类型转换成构造函数所在的类对应的类型。举个例子,假设有如下类Complex:1classComplex{2private:3inti;4intj;56public:......
  • 位图&布隆过滤器剖析 #C++
    位图位图概述位图(bitset)中存储位(bit),每个元素只有两个可能值,1/0或者true/false。与bool数组相比,位图的空间开销更小,每个元素占据1bit空间,是C++最小内置类型char的八分之一。位图是哈希思想衍生出的容器,在完成哈希表判断元素存在功能的同时,极大地节省了所需的内存空间。位图......
  • 29、Flink SQL之DESCRIBE、EXPLAIN、USE、SHOW、LOAD、UNLOAD、SET、RESET、JAR、JOB
    Flink系列文章1、Flink部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接13、Flink的tableapi与sql的基本概念、通用api介绍及入门示例14、Flink的tableapi与sql之数据类型:内置数据类型以及它们的属性15、Flink的tableap......
  • 结对项目,用C++实现的四则运算
    软件工程计科一班陈倚星-3119000414,甫尔达吾斯.吐拉江-3119000416作业要求与班上同学组队完成项目作业目的提高合作与团队意识GitHub链接https://github.com/xingch123456789/my_appPSP表格PSP2.1PersonalSoftwareProcessStages预估耗时(分钟......
  • C++的extern关键字在HotSpot VM中的重要应用
    extern关键字有两个用处:(1)extern在C/C++语言中表示函数和全局变量作用范围(可见性)的关键字,这个关键字会告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。(2)在C++中引用C语言中的函数和变量,在包含C语言头文件时,需要使用extern"C"来处理。 1、extern表示函数和变量作......
  • mlpack is an intuitive, fast, and flexible header-only C++ machine learning libr
    https://github.com/mlpack/mlpack README.md afast,header-onlymachinelearninglibraryHome | Documentation | Community | Help | IRCChat   Download: currentstableversion(4.2.1)mlpack isanintuitive,fast,andflexibleheader-......
  • C++11 多线程< 一>、介绍
    1#include<iostream>2#include<thread>34voidfun1()5{6std::cout<<"fuck"<<std::endl;7}89intmain()//主线程10{11std::threadt1(fun1);//t1线程12//t1.join();//主线程和t1互不干扰,......
  • QML中使用C++对象
    QML中使用C++对象原文链接:(60条消息)QtQuick之QML与C++混合编程详解_qmlc++_foruok的博客-CSDN博客QtQuick技术的引入,使得你能够快速构建UI,具有动画、各种绚丽效果的UI都不在话下。但它不是万能的,也有很多局限性,原来Qt的一些技术,比如低阶的网络编程如QTcpSoc......
  • C++友元和运算符重载
    友元classbuiding{friendvoidGoodboy(buiding*bui);public:intm_age;private:intm_size;};//全局函数voidGoodboy(buiding*bui){cout<<bui->m_age<<endl;//可以调用public中的m_agecout<<bui->m_size<<endl;//m_size调用需要声明友元}私有......