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

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

    代码清单1-1 从C++智能指针获取的裸指针变成悬垂指针 1 #include <iostream> 2 #include <memory> 3 4 int main() 5 { 6 第2行包含内存管理库,提供智能指针如std::shared_ptr的支持。第4行到第5行定义程序的入口点main函数。第6行输出提示信息,表明悬垂指针示例开始运行。 ("Rust 避免悬垂指针示例开始运行..."); 3 4 let reference; 5 6 { 7 let smart_ptr = Box::new( ("Rust 避免悬垂指针示例开始运行..."); 3 4 let raw_ptr; 5 6 { 7 let smart_ptr = Box::new(42 第4行声明一个裸指针变量,但暂不初始化。第6-14行创建一个新的作用域。第7行同代码清单1-2,绑定一个Box<T>智能指针,指向堆上的整数42。第8行从智能指针获取裸指针

    1.6K61编辑于 2024-09-18
  • 来自专栏AI编程之旅

    给前端同学的 C++ 悬垂指针入门:为什么 Crash 会概率性发生

    1.3 悬垂指针对象生命周期已经结束,但仍有指针指向原来的内存地址,这类指针更正式地称为悬垂指针(dangling pointer),也常被口语化地称为野指针。 所以,C++ 悬垂指针问题天然可能是“概率性”的。2. 6. 排查这类问题时怎么想不要只看 Crash 的那一行。Crash 行通常只是“最后踩雷的地方”,不是“埋雷的地方”。可以按这几个问题往回查:1. 是否有 `vector<Listener*>` 这类原始指针容器?3. 谁把这个指针放进去的?4. 对象销毁时,是否一定会把指针移除?5. 清理逻辑里是否有提前 return?6. 总结C++ 悬垂指针问题之所以难,是因为它不一定稳定复现。但不稳定不代表没问题。只要满足:对象已经销毁仍有地方保存它的地址未来可能继续访问这个地址这就是确定的代码风险。

    18810编辑于 2026-06-01
  • 来自专栏技术分享

    指针(6)---qsort函数

    而*comapr也就是指向这个函数的指针。 对指针数组进行排序,可以按照指针指向的值进行排序。

    25810编辑于 2024-06-18
  • 【C语言】指针(6)

    对于数组名的含义还不了解的话可以去看我的指针3那篇文章! ,也就相当于给strlen里传入了一个野指针 这时程序就会报错!。 &arr+1取出整个数组的地址再加1就相当于跳过一个数组指向该数组的末尾 只要数组内部无\0再怎么去查找都是找不到的 所以也是随机值但是会与从第一个元素开始查找得到得随机值相差6(6为元素个数)。 &arr取地址a取出的是整个数组的地址 整个元素的地址是从首元素开始的从第一个元素开始直到碰到\0 所以结果为66. 但是会与从第一个元素开始查找得到得随机值相差6(6为元素个数) &arr[0]+1拿到的是第二个元素的地址那就是从第二个元素开始统计 所以结果为5。

    27200编辑于 2025-12-23
  • 来自专栏C++

    C语言(指针6

    存放变量地址的指针叫一级指针,存放数组地址的指针叫数组指针,存放指针地址的指针叫二级指针,那存放函数的指针就叫函数指针。在学习函数指针之前,我们先来探讨一下函数的地址。 2.函数指针 在了解了函数的地址后,为了存放函数的地址,我们就来探究函数指针。跟其他指针一样,第一步肯定是要确定指针的类型。 去掉上面的函数指针变量名剩下的就是函数指针的类型,可以看到函数指针类型和数组指针类型很像,同样的,表示指针变量的 “ * ” 和指针变量名是结合在一起的,要用圆括号括起来。 是的,同样是用解引用操作符 “ * ” 解引用函数指针变量: 同样的,解引用操作时 “ * ” 和指针变量名也要用圆括号括起来,不然指针变量名就会与后面的括号结合,使得指针变量名变成一个函数名 同样的,数组指针类型和函数指针类型也都是可以用 typedef 关键字重命名的,但是对于数组指针和函数指针来说稍微有点区别。

    24410编辑于 2024-10-16
  • 指针篇(6)- sizeof和strlen,数组和指针笔试题

    1.3 sizeof和strlen的对比 二、数组和指针笔试题解析 图示指针3文章的内容,这里会用到 还需要指针1内存的知识 2.1 一维数组 int main() { int a[] = 注意:数组的地址就是数组最开始位置的地址,数组首元素地址也是那个地址,地址就是指针,在指针1中写过,指针变量的大小与类型无关,就是4/8个字节,只与运行环境有关。 ,因为&arr取出的就是一个6个字符的数组的地址,+1之后类型不变,还是一个数组指针。 这里的随机值比最初的arr地址打印出的随机值少6,因为跳过了6个字符。 总结 以上就是指针6的内容了,指针7将继续写一些指针运算相关的笔试题,不得不说期末周考完就是爽啊,安安心心学编程搞文章舒服多了。喜欢的靓仔靓女们不要忘记一键三连给予支持哦~

    29410编辑于 2025-12-30
  • 来自专栏mathor

    枚举+优化(6)——双指针优化2

    有了这个结论我们就可以利用双指针的思路了。首先我们把3个数组都排序,然后依次枚举A数组中的一个数A[i],表示我们从A数组挑选出的数是A[i]。

    67650发布于 2018-06-19
  • 来自专栏海天一树

    小朋友学C++(6):this指针

    this指针是一个隐含于类中的特殊指针,指向对象本身。也就是说对象一旦被创建,this指针也就存在了。

    65560发布于 2018-04-17
  • 来自专栏CSDN搜“看,未来”

    【C++】算法集锦(6):快慢指针

    快排 双边遍历 首先啊,确定基准为4,左指针指向第一个元素,右指针指向尾巴。 左指针开始,向前遍历,找到第一个大于基准的元素就停下,轮到右指针,同理。 当两个指针都停下之后,将两个指针所指向的值互换位置。 重复上述步骤直到左右指针重合。 重合之后,将基准元素与左右指针当前位置元素进行互换。 doubleSideSort(vec1,0,left-1); doubleSideSort(vec1, right, keep_right); } int main() { vector<int> vec1 = { 4,6,8,7,9,3,1 其实说简单也简单,快慢指针就解决了,快指针两步走,慢指针一步走,只要两个指针重合了,那就说明有环,因为快指针绕回来了。 时间复杂度为线性,空间复杂度为常数。 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: 1->1->2->3->4->4->5->6 思路: 将 k 个链表配对并将同一对中的链表合并; 第一轮合并以后

    56730发布于 2021-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; // 悬垂指针

    48610编辑于 2025-12-16
  • 来自专栏Linux云计算网络

    C++primer笔记之顺序容器

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

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

    C++Primer笔记之复制控制

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

    81760发布于 2018-01-10
  • 来自专栏nginx遇上redis

    UAF你懂吗?

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

    1.3K20发布于 2019-10-15
  • 来自专栏C++

    C语言基础:(十六)深入理解指针6

    前言 本期是C语言基础中有关指针的最后一篇博客,本期将为大家介绍sizeof和strlen的对比、数组和指针乃至指针运算的笔试题解析。那么现在让我们开始吧! 3.4 题目四 #include <stdio.h> int main() { int aa[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; int return 0; } aa是一个 2x5 的二维数组,初始化如下: int aa[2][5] = { {1, 2, 3, 4, 5}, // aa[0] {6, int 占 4 字节): 地址 值 &aa[0][0] 1 &aa[0][1] 2 &aa[0][2] 3 &aa[0][3] 4 &aa[0][4] 5 &aa[1][0] 6 所以 ptr2 指向 aa[1][0](即 6)。ptr2 指向 aa[1][0],ptr2 - 1 回退 1 个 int(4 字节)。

    20210编辑于 2026-01-14
  • 来自专栏蒙奇D索隆的学习笔记

    计算机初级选手的成长历程——指针6

    ,对于决定是指针类型还是指针变量的关键在于*,所以对于指针来说*才是指针定义的关键。 根据指针指针变量的定义,指针就是地址,指针变量就是存储指针的变量。 ; 15.5.2 数组指针指针数组的区别 在理解了数组与指针的区别后,我们再来看一下指针数组与数组指针的区别: 指针数组与数组指针的内存空间不同 从反汇编界面我们可以看到: 指针数组在申请空间时,会根据数组大小来申请对应数量的空间 接下来我们就来探讨一下数组指针与二级指针的异同点; 15.5.3 数组指针与二级指针 对于同为指针的数组指针和二级指针来说,它们有很多相同的地方: 内存中申请的空间相同 对于指针来说,指针指向的是对象的地址 不管是一级指针、二级指针还是数组指针也好,只要是指针它们都只会在内存空间中申请一块空间来存放数据; 工作原理相同 二级指针是先通过存储的一级指针的地址找到一级指针,再对一级指针进行解引用找到一级指针中存储的变量的空间地址

    40210编辑于 2023-12-18
  • 来自专栏C++

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

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

    87010编辑于 2024-11-19
  • 来自专栏AI编程之旅

    前端开发者的 C++ 实战补漏:Lambda 捕获与生命周期

    假如 lambda 也自动引用捕获,对象一旦析构,闭包里的引用全是悬垂的,而且编译器没法帮你检查。这在 C++ 里会是灾难性的。 这个选择权的代价是你要自己判断生命周期,好处是不会在不知情的情况下悬垂。这是 C++ 一贯的设计哲学:显式优于隐式,代价换控制力。 f2 拿的是 x 的引用,能改外部变量,但代价是外部变量一旦销毁,这个引用就悬垂了。 6. weak_ptr 怎么守住异步回调既然 this 不能直接捕获,异步回调里要访问对象怎么办。 值捕获拍快照,安全但占内存;引用捕获拿引用,省内存但可能悬垂。跨线程、跨异步默认用值捕获,引用捕获只用于确定变量比 lambda 长寿的同步场景。

    13410编辑于 2026-06-24
  • 来自专栏我的技术专栏

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

    具体而言,复制对象时,副本和原对象都指向同一存储区域,如果通过一个副本改变其所指的值,则通过另一对象访问的值也会改变.所不同的是,智能指针能够对内存进行进行自动管理,避免出现悬垂指针等情况。 而智能指针也致力于解决这种问题,使程序员专注于指针的使用而把内存管理交给智能指针。 我们先来看看普通指针悬垂指针问题。 于是悬垂指针就形成了,程序崩溃也“指日可待”。我们通过代码+图来来探求悬垂指针的解决方法。 如果有个办法让ptr1知道,除了它自己外还有两个指针指向基础对象,而它不应该删除基础对象,那么悬垂指针的问题就得以解决了。如下图: ? ? 那么何时才可以删除基础对象呢? Point *pa = new Point(10, 20); SmartPtr sptr1(pa); //像指针般使用 cout<<sptr1->getX(); 6.智能指针改进二

    2.8K41发布于 2018-07-02
  • 【C++类和数据抽象】管理指针成员

    这样的类具有指针的所有缺陷,如悬垂指针、内存泄漏等,但无需特殊的复制控制。 缺点:容易导致悬垂指针和内存泄漏问题。 智能指针通过引用计数来防止悬垂指针的出现。当智能指针的引用计数降为0时,它会自动删除所指向的对象。 ,避免了悬垂指针和内存泄漏问题。 使用这些智能指针可以大大简化内存管理,并减少内存泄漏和悬垂指针的风险。 封装和抽象指针管理逻辑:通过封装和抽象来隐藏指针的细节,使代码更加清晰和易于维护。

    19010编辑于 2026-01-21
  • 深入解析 C++ 的内存管理机制

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

    66910编辑于 2025-06-06
领券