首页 > 编程语言 >C++(野指针)

C++(野指针)

时间:2024-06-21 09:42:55浏览次数:12  
标签:int C++ 作用域 内存 指针 ptr delete

野指针(Dangling Pointer)是在C++中指向无效内存位置的指针。野指针通常发生在以下几种情况下:

  1. 释放了内存但没有将指针设为NULL:
    当使用deletedelete[]释放内存后,指针仍然保持指向原来的地址,但该地址已经无效。

    int* ptr = new int(10);
    delete ptr;
    // ptr现在是野指针
    
  2. 栈上对象的指针在超出作用域后继续使用:
    当一个指向栈上对象的指针在对象的作用域结束后继续使用,指针将成为野指针。

    int* danglingPointer;
    {
        int localVariable = 42;
        danglingPointer = &localVariable;
    }
    // localVariable超出作用域,danglingPointer现在是野指针
    
  3. 内存被重新分配:
    当指向某块内存的指针,内存被重新分配给其他变量或对象后,原指针也会变成野指针。

    int* ptr = new int[10];
    int* otherPtr = ptr;
    delete[] ptr;
    // otherPtr现在是野指针
    

避免野指针的措施

  1. 及时将指针设为NULL:
    在释放内存后,将指针设为NULL,以防止误使用。

    int* ptr = new int(10);
    delete ptr;
    ptr = nullptr;  // 现在ptr是一个空指针,而不是野指针
    
  2. 使用智能指针:
    C++11引入的智能指针(如std::unique_ptrstd::shared_ptr)可以自动管理内存的生命周期,减少野指针的风险。

    std::unique_ptr<int> ptr = std::make_unique<int>(10);
    // 不需要手动delete,ptr超出作用域时会自动释放内存
    
  3. 谨慎使用指针:
    避免将栈对象的地址传递到函数外部或保存超出其作用域的指针。

  4. 使用调试工具:
    使用像Valgrind这样的工具来检测和调试内存问题,包括野指针。

标签:int,C++,作用域,内存,指针,ptr,delete
From: https://www.cnblogs.com/keye/p/18259933

相关文章

  • 深入了解C++存储类
    在C++编程中,存储类(StorageClass)指定了变量的生命周期、可见性和存储位置。了解存储类是编写高效、清晰代码的基础。本文将详细介绍C++中各种存储类的定义、特点和使用场景。一、存储类概述C++中的存储类主要包括以下几种:自动存储类(auto)寄存器存储类(register)静态存储类(st......
  • 深入了解C++运算符
    C++是功能强大的编程语言,提供了丰富的运算符集合。运算符是用于执行各种操作的符号或关键字,包括数学运算、比较、逻辑操作、位操作等。本文将详细介绍C++中的各种运算符,并通过示例说明其用法。一、算术运算符算术运算符用于执行基本的数学运算,包括加、减、乘、除和取余。......
  • C++数据格式化6 - uint转换成二六进制字符串
    1.关键词2.strfmt.h3.strfmt.cpp4.测试代码5.运行结果6.源码地址1.关键词C++数据格式化字符串处理std::stringintbin跨平台2.strfmt.h#pragmaonce#include<string>#include<cstdint>#include<sstream>#include<iomanip>namespacecutl{......
  • C++数据格式化5 - uint转换成十六进制字符串&二进制的data打印成十六进制字符串
    1.关键词2.strfmt.h3.strfmt.cpp4.测试代码5.运行结果6.源码地址1.关键词关键字:C++数据格式化字符串处理std::stringinthex跨平台应用场景:int型的数据打印成十六进制字符串二进制的data打印成十六进制字符串。2.strfmt.h#pragmaonce#include<......
  • 2024华为OD机试真题- 计算三叉搜索树的高度-(C++/Java/Python)-C卷D卷-100分
     2024华为OD机试题库-(C卷+D卷)-(JAVA、Python、C++) 题目描述定义构造三叉搜索树规则如下:每个节点都存有一个数,当插入一个新的数时,从根节点向下寻找,直到找到一个合适的空节点插入。查找的规则是:1.如果数小于节点的数减去500,则将数插入节点的左子树2.如果数大于节点的......
  • C++程序编译 错误提示和评测状态
    编译常见错误提示1.[Error]expected';'before'cout'。在cout前面,缺少一个分号。2.[Error]'arr'wasnotdeclaredinthisscope。未定义变量名arr。3.[Error]ldreturned1exitstatus。重复运行错误(上一个运行的程序,输入窗口没有关掉)。  或者main写错了。......
  • 「C++」复杂模拟【壹】
    建议开启目录食用阅读本文之前建议您先看这里,如果您已经看完了,那么就可以放心大胆的学习本文了。我认为其实本文的难度还是比较大的,今天我们题是来自山东省省选,所以建议大家谨慎阅读,如果您是专业程序员当我没说。OK,那么事不宜迟,咱们来看第一题[SDOI2010]猪国杀题目描述游戏......
  • 《C++ Primer》导学系列:第 6 章 - 函数
    6.1函数基础6.1.1基本概念函数是C++程序的基本组成单元,用于将代码组织成可以复用的模块。函数通过函数名进行调用,并且可以接受参数和返回值。函数的定义包括函数头和函数体,其中函数头描述了函数的接口,函数体包含了具体的实现代码。函数的定义函数的定义通常包括返回类型......
  • 函数内部返回指向字符串的指针和数组名的区别
    目录两道题目进程的内存分布结论两道题目先来看两道与内存管理有关的题目以下程序会出错吗?如果不会则输出什么?#include<stdio.h>char*func(){ char*str="HelloWorld"; returnstr;}intmain(){ char*str=func(); //程序输出HelloWorld printf("%s\n",......
  • 使用 TensorRT C++ API 调用GPU加速部署 YOLOv10 实现 500FPS 推理速度——快到飞起!!
    ​NVIDIA®TensorRT™是一款用于高性能深度学习推理的SDK,包含深度学习推理优化器和运行时,可为推理应用程序提供低延迟和高吞吐量。YOLOv10是清华大学研究人员近期提出的一种实时目标检测方法,通过消除NMS、优化模型架构和引入创新模块等策略,在保持高精度的同时显著降低了......