首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏用AI私教速通Rust

    Rust避坑现代C++悬垂指针

    std::cout << "C++ 悬垂指针示例开始运行..." << std::endl; 7 8 int* rawPtr = nullptr; 9 10 {11 std: 第8行初始化一个裸指针rawPtr,并将其设置为nullptr,表示当前不指向任何有效内存。第10行开始一个新的作用域,用于限定smartPtr的生存期。 通过这种方式,Rust在提供灵活性的同时保证了内存安全,有效地防止了悬垂指针和其他常见的内存错误。第10行打印智能指针管理的值。第12行打印引用指向的值。 ); 8 raw_ptr = &*smart_ptr as *const i32; // 获取裸指针 9 10 println! 在纯 Rust 代码中,通常应避免使用裸指针,除非有特殊需求。第10-13行打印智能指针和裸指针指向的值。 第14行作用域结束,smart_ptr被销毁,其指向的内存被释放。

    1.4K61编辑于 2024-09-18
  • 来自专栏CSDNToQQCode

    Rust实战案例-内存安全完整演示与深度解析

    所有权系统 - 防止悬垂指针 4. 借用检查器 - 防止数据竞争 5. 生命周期系统 - 防止悬垂引用 6. RAII 机制 - 自动资源管理 7. 智能指针 - 安全的共享所有权 8. 项目概述 1.1 项目目标 本项目通过13 个实际演示,全面展示 Rust 的内存安全特性: ✅ 所有权系统防止悬垂指针 ✅ 借用检查器防止数据竞争 ✅ 生命周期系统防止悬垂引用 ✅ RAII 机制防止内存泄漏 内存安全问题概览 2.1 常见的内存安全问题 问题类型 描述 危害 其他语言 悬垂指针 指向已释放内存的指针 程序崩溃、安全漏洞 C/C++ 常见 双重释放 释放同一块内存两次 程序崩溃、内存损坏 C/ 悬垂指针问题 C/C++ 代码(危险): // ❌ C:可能出现悬垂指针 char* create_string() { char str[] = "临时数据"; return str; // 悬垂指针

    34910编辑于 2025-12-16
  • 来自专栏开发语言-Go

    Go语言学习10-指针类型

    引言书接上篇,Huazie 带大家了解了Go语言的《结构体类型》,本篇将要介绍Go语言的指针类型。主要内容指针是一个代表着某个内存地址的值。这个内存地址往往是在内存中存储的另一个变量的值的起始位置。 Go语言既没有像Java语言那样取消了代码对指针的直接操作的能力,也避免了 C/C++ 语言中由于对指针的滥用而造成的安全和可靠性问题。Go语言的指针类型指代了指向一个给定类型的变量的指针。 它常常被称为指针的基本类型。指针类型是Go语言的复合类型之一。1. 类型表示法可以通过在任何一个有效的数据类型的左边加入 * 来得到与之对应的指针类型。 例如,一个元素类型为 int 的切片类型所对应的指针类型是 *[]int ,前面的结构体类型 Sequence 所对应的指针类型是 *Sequence。 它的值是一个能够保存一个指针类型值(简称指针值)的位模式形式。2. 值表示法如果一个变量 v 的值是可寻址的,表达式 &v 就代表了指向变量 v 的值的指针值。

    26811编辑于 2024-10-07
  • 来自专栏C语言程序指南

    c语言进阶指南(10)(指针与数组)

    欢迎来到博主的专栏:C语言进阶指南博主id:reverie_ly指针的算术运算指针可以进行加和减以及自加和自减算术运算。运算结果是地址值加或减指针类型指向的元素的空间大小。 int i = 0;int arr[10] = { 1,2,3,4,5,6,7,8,9 ,10};int* pi = arr;for (i = 0; i < 10; i++) {printf("%d " 降级的例子是int i = 0;int arr[10] = { 1,2,3,4,5,6,7,8,9 ,10};for (i = 0; i < 10; i++) {printf("%d ", *(arr + i));}return 0;这里没有使用指针变量来进行操作,而是使用数组名来进行指针操作。 这两个类型的区别就在于声明阶段了int arr[10]={1,2,3,4,5,6,7,8,9,10};//正确int* pi = {1,2,3,4,5,6,7,8,9,10};//非法int[]可以声明一个数组

    24710编辑于 2024-06-13
  • 来自专栏人人都是极客

    10分钟,掌握C语言指针

    void f() { int* a; *a = 10; } 像这样的代码是十分危险的。 } printf("\n"); } return 0; } 运行结果: //Consequence 09 0 1 2 3 4 5 6 7 8 9 10 //Example 10 #include <stdio.h> int main(void) { int num = 1024; int* pi = # char* ps ps; printf("ps:%p,pv:%p\n", ps, pv); printf("*pv:%s\n", *pv); } 这样会报错: //Error in Example 10 错误 C2100 非法的间接寻址 错误 C2100 非法的间接寻址 如果一定要这么做,那么可以用「强制类型转换」: //Example 10 V2 #include <stdio.h> int main

    1.7K30发布于 2020-11-03
  • 深入解析 C++ 的内存管理机制

    这种自由虽带来高性能,但也容易埋下内存泄漏、悬垂指针等隐患。 4.2 悬垂指针指针指向的内存已被释放:cpp复制编辑int* p = new int(5);delete p;*p = 10; // 未定义行为4.3 野指针指针未初始化,指向未知地址:cpp复制编辑 int* p; // 未初始化*p = 10; // 错误! 七、现代 C++ 的智能指针C++11 引入智能指针机制,自动管理动态内存,防止内存泄漏与悬垂指针。7.1 std::unique_ptr独占所有权,不能拷贝,只能移动。 回顾重点: 栈 vs 堆 vs 静态区的分配区别 new/delete 与构造析构的配对使用 常见错误:悬垂指针、内存泄漏、越界访问 智能指针(unique_ptr、shared_ptr)的使用

    54910编辑于 2025-06-06
  • 来自专栏nginx遇上redis

    UAF你懂吗?

    又被使用指的是:指针存在(悬垂指针被引用)。这个引用的结果是不可预测的,因为不知道会发生什么。由于大多数的堆内存其实都是C++对象,所以利用的核心思路就是分配堆去占坑,占的坑中有自己构造的虚表。 首先要说明2个概念:   1.悬垂指针悬垂指针是指一类不指向任何合法的或者有效的(即与指针的含义不符)的对象的指针。 比如一个对象的指针,如果这个对象已经被释放或者回收但是 指针没有进行任何的修改仍然执行已被释放的内存,这个指针就叫做悬垂指针   2.UAF漏洞:Use-After-Free是一种内存破坏漏洞,简单的说 ,漏洞的原因是使用了悬垂指针

    1.2K20发布于 2019-10-15
  • 来自专栏Linux云计算网络

    C++Primer笔记之复制控制

    4、智能指针 智能指针是由于在有指针成员的类中,指针所指向的对象是共享的,防止出现悬垂指针而提出的一种管理指针的办法。 ->ip; 7 } 8 int getValue() { 9 return val; 10 } 11 12 void setPtr(int *p) 再看,可能出现悬垂指针的情况: int *ip = new int(42); HasPtr ptr(ip, 10); delete ip; ptr.set_ptr_val(0); //Disaster! 这里ip和ptr中的指针指向了同一对象,删除了该对象时,ptr中的指针不再指向有效对象,但是你又不知道该对象不在了,所以,这样就出现了悬垂指针。 所以,定义智能指针能有效地解决这个问题,为了避免多个指针共享一个对象时撤销出现的悬垂指针问题,定义智能指针类的主要功能就是来保证在撤销指向对象的最后一个指针时才删除该对象。

    75260发布于 2018-01-10
  • 来自专栏Linux云计算网络

    C++primer笔记之顺序容器

    4、悬垂指针悬垂指针可以引出野指针,垃圾内存以及内存黑洞等相关概念,我们一点点来看: 悬垂指针:当所指向的对象被释放或者收回,但是对该指针没有做任何修改,以至于该指针仍旧指向已经回收的内存地址,此情况下该指针便称为悬垂指针 (也称迷途指针)。 一般以如下形式(C++)可以避免悬垂指针: delete cp; cp = NULL; //此处一定要记得! 野指针:其产生是由于某些指针在首次使用之前没有进行必要的初始化,这类指针就称为野指针。 垃圾内存:针对于某个指针来说,常常指不合法的内存,某些内存free或delete后没有将其设置为NULL,这样的内存就是垃圾内存。 内存“黑洞”:和上面三个完全不同的概念,特指对一个指针施加free或delete前就把这个指针设置为NULL,这样之后,这块内存并不属于编译器,它只属于某个变量的合法访问区域,但这个访问的指针已经不存在了

    68790发布于 2018-01-10
  • 来自专栏C++/Linux

    【C++】函数返回方式详解:传值、传引用与传地址

    , 20); // 接收副本 p.print(); // 输出(10,20) return 0; } 输出结果: 构造函数被调用 拷贝构造函数被调用 // 实际编译可能会优化此拷贝 (10,20) 注意:现代编译器通常会进行返回值优化(RVO/NRVO),可能会省略拷贝构造函数的调用,提高性能。 传值返回的特点 安全性高:返回的副本独立于函数内部对象,避免了悬垂引用 / 指针问题 存在拷贝开销:对于大型对象,拷贝操作可能影响性能 适用场景:返回基本数据类型、小型结构体或类对象 二.传引用返回 传引用返回是返回对象的引用 需要手动管理内存:对于动态分配的内存,必须记得释放,否则会导致内存泄漏 存在悬垂指针风险:如果指针指向的对象被销毁,指针将变为悬垂指针 适用场景: 需要表示 "空结果" 的场景 动态内存分配操作 ) 能否修改原始对象 不能 能(非 const 引用) 能(通过解引用) 能否返回空值 不能 不能(引用必须绑定对象) 能(返回 nullptr) 生命周期风险 无 可能返回局部变量引用 可能返回悬垂指针

    18910编辑于 2025-10-29
  • 【C++类和数据抽象】管理指针成员

    size]) {} ~Problematic() { delete data; } // 错误:应使用delete[] }; void test() { Problematic p1(10 这样的类具有指针的所有缺陷,如悬垂指针、内存泄漏等,但无需特殊的复制控制。 缺点:容易导致悬垂指针和内存泄漏问题。 智能指针通过引用计数来防止悬垂指针的出现。当智能指针的引用计数降为0时,它会自动删除所指向的对象。 ,避免了悬垂指针和内存泄漏问题。

    10810编辑于 2026-01-21
  • 来自专栏我的技术专栏

    C++ 引用计数技术及智能指针的简单实现

    而智能指针也致力于解决这种问题,使程序员专注于指针的使用而把内存管理交给智能指针。 我们先来看看普通指针悬垂指针问题。 于是悬垂指针就形成了,程序崩溃也“指日可待”。我们通过代码+图来来探求悬垂指针的解决方法。 如果有个办法让ptr1知道,除了它自己外还有两个指针指向基础对象,而它不应该删除基础对象,那么悬垂指针的问题就得以解决了。如下图: ? ? 那么何时才可以删除基础对象呢? main() { //定义一个基础对象类指针 Point *pa = new Point(10, 20); //定义三个智能指针类对象,对象都指向基础类对象pa // Point *pa = new Point(10, 20); SmartPtr sptr1(pa); //像指针般使用 cout<<sptr1->getX(); 6.智能指针改进二

    2.6K41发布于 2018-07-02
  • 来自专栏C++

    指针+数组指针+字符指针+指针数组

    指针 指针作为C语言的核心部分,相比较其他的内容相对比较难懂一下,应用的方式多样,变化较多,导致很多的同学非常苦恼,那么接下来,我将陪你来共同揭开指针的神秘面纱; 指针的含义 大家不要把指针想的太难,指针其实就是通过地址找到对应的变量的位置 ,然后我们可以对地址进行解引用来访问变量的内存,来获取值的一种间接方法;我们通常说指针指向哪里哪里,就是指针变量里面存的其他变量(或者常量)的地址;即  指针->地址->内存; 普通变量指针 首先,我们现来看看指针的构成以及表达形式 ; 数组指针 数值指针,其主体是指针,他就是个指针,不过是有点不同而已,这个指针指向的是数组的地址,在此之前我们需要了解数组的地址; 数组的地址; 我们通常说数组的地址是数组名,是数组的首元素地址,也确实是这样 个字节也就是一个整形的大小,而此时确实是指向了数组内第二个元素的地址,步长是一个元素类型所占字节数,也就是指向了下一个元素; 2.我们看后面两行,对数组名取地址+1的地址增加了'\x14'(地址是用16进制表示的),转化为10 字符指针 含义 字符指针就是指针指向了字符或者字符串,因为字符串可以看成是一个字符数组,所以字符串指针与数组指针大致可以类比; 字符指针打印字符串 这里我使用了三种打印字符串的方式,从结果上看,很明显打出来的字符串都是相同的

    68910编辑于 2024-11-19
  • 来自专栏Rust入门笔记

    【Rust学习】05_引用与借用

    悬垂引用 在具有指针的语言中,很容易通过释放内存时保留指向它的指针而错误地生成一个 悬垂指针(dangling pointer),所谓悬垂指针是其指向的内存可能已经被分配给其它持有者。 相比之下,在 Rust 中编译器确保引用永远也不会变成悬垂状态:当你拥有一些数据的引用,编译器确保数据不会在其引用之前离开作用域。 让我们尝试创建一个悬垂引用,Rust 会通过一个编译时错误来避免: fn main() { let reference_to_nothing = dangle(); } fn dangle() 我们将在第 10 章中详细讨论生命周期。 return type contains a borrowed value, but there is no value for it to be borrowed from 让我们仔细看看在dangle(悬垂

    35410编辑于 2024-07-29
  • 来自专栏星河造梦坊专栏

    HTC VIVE丨10. 自定义瞬移指针

    二、VRTK_BezierPointerRenderer组件 要实现自定义瞬移指针,则需要对VRTK_Bezier/Straight Pointer Renderer进行设置。 Cursor:指针与碰撞体交界处的光标 Tracer:构成曲线的单一元素 Valid Collision Color:可用时的颜色 Invalid Collision Color:不可用时的颜色 Rescale Tracer:勾选后可根据曲线长短来自动缩放Tracer Custom Tracer:用户自定义的Tracer,构成曲线的单一元素 Custom Cursor:自定义的Cursor,指针与碰撞体交界处的光标

    24410编辑于 2024-08-14
  • 来自专栏C语言入门到精通

    C语言用指针10个数排序

    例31:C语言用指针方法对10个整数按由大到小顺序排序。 解题思路:在主函数中定义数组,用来存放10个整数,定义int *型指针变量p指向a[0],定义函数sort将数组中的元素按由大到小排序。 ];//定义整型变量、指针变量、数组    p=a;//读者需要注意这里a赋值    printf("请输入十个数:");//提示语句    for(i=0;i<10;i++)//输入10个数    { 读者需要注意上述小林scanf函数用的逗号,注意是英文逗号: scanf("%d,",p++); 在上一节小林说过,给指针变量赋的是地址,如下: int i,*p,a[10]; p=a; 但上述代码中却是这样赋值 : int i,*p,a[10]; p=&a; 是因为我定义的a就是数组,在C语言中,数组名可以表示地址,因此不用再加取地址符&,读者需要了解。 C语言 | 用指针10个数排序 更多案例可以go公众号:C语言入门到精通

    3K2320发布于 2020-12-11
  • 来自专栏用户8907256的专栏

    小白程序猿10分钟彻底打败指针

    代码如下: #include <stdio.h>void swap(int* a, int* b);int main(int args, char *argv[]) { int a = 10; int b = 20; int*pa = &a;//获取变量a的地址赋值给指针pa int* pb = &b; printf("%i\n", *pa);//输出10 *pa = *pa + 1; printf 5、结构体类型指针 声明方式如下: struct 结构体类型 {…}*p;例如结构体声明如下: struct point { int x=10; int y=20; } ; 那么结构体类型指针声明如下 ; p.y = 20; struct point* pp = &p; printf("%i\n", p.x);//输出10 printf("%i\n", (*pp).x);//输出10 printf ("%i\n", (*pp).y);//输出20 printf("%i\n", pp->x);//输出10 printf("%i\n", pp->y);//输出20 } 上述代码中->是C语言提供的结构体指针访问成员的快捷方式

    42040发布于 2021-08-13
  • 来自专栏CSDN搜“看,未来”

    C++编程经验(7):delete之后到底要不要置空?

    很不幸的是,对于这种逻辑错误开发者往往没有特别好的手段可以规避掉,二次delete一个悬垂指针行为是未定义的,也就是说错误是有可能被隐藏的。 当然“delete后置空指针”这种教条能流传这么久,肯定是有它的道理的。 关于到底什么时候需要置空指针,关键之处在于搞清楚置空指针到底解决了什么问题。 先来理一下nullptr和野指针/悬垂指针的区别: 解引用: nullptr:未定义 野指针/悬垂指针:未定义 delete nullptr:良好定义,delete什么也不用做 野指针/悬垂指针:未定义 值:nullptr:明确 野指针/悬垂指针:未定义,无法确定 可以发现nullptr最大的优势在于值是明确的,也就是说分辨一个指针是不是nullptr比分辨一个指针是不是野指针/悬垂指针要容易得多。 至此,我们至少可以得出一个结论,如果对象是和持有其的指针一同销毁的,那置空指针就是脱裤子放屁。

    3.3K20发布于 2021-09-18
  • 来自专栏C++核心编程

    CCPP 指针变量 | 数组指针 | 指针数组 | 野指针 | 空指针

    普通变量和指针变量 共性 PS: 可见这4个函数的汇编指令完全一致,无论是什么类型的指针变量,对指针变量的读写跟普通变量没有任何区别,所谓的指向只是描述指针变量的值时多少而已,就读写而言,指针变量跟普通变量没有任何区别 空指针和野指针指针:定义了一个指针变量,如果没有进行初始化,系统就会有可能随机赋值一个地址给这个指针变量,也就是说,这个指向指向一个未知的区域。 空指针:空指针不是指向常数0,只指向地址0,即NULL,其实换句话说,指针的本质就是地址嘛,空指针就是指针本身的值(地址)为0空指针的作用是防止野指针的出现,因为我们不能知道野指针到底指向哪里,所以我们也无法判断一个指针是否是野指针 PS: 区分指针数组int *a[3]和数组指针int (*a)[3],前者时存放指针的数组,后者是指向数组的指针。 那现在我们清楚p2 是一个指针,它指向一个包含10 个int 类型数据的数组,即数组指针

    2.3K20编辑于 2022-10-04
  • 来自专栏可涵的从小白到大牛的征程

    指针进阶(1)(字符指针指针数组,数组指针,函数指针

    前言: 本文主要讲解指针进阶部分的内容,分为字符指针指针数组,数组指针,函数指针。 int *arr[5];//存放整型地址的指针数组 char *arr[6];//存放字符类型的指针数组 数组指针 概念辨析 我们类比一下: 整型指针:指向整型变量的指针,存放整型变量的地址的指针。 数组指针:指向数组的指针,存放数组地址的指针。 形式辨析 int * p; 首先*表示这是一个指针,命名为p,然后指向的是int类型的指针,数组指针也一样 int(*p) [5]; 上面的形式就是数组指针,我们需要先用()把*和指针名括起来,然后剩下的就是指针指向的类型 数组接受时,行可以省略,但是列不能 指针接收,必须用数组指针来接收。 函数指针 函数指针就是指向函数的指针

    60010编辑于 2024-10-16
领券