首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

当内存被其他对象使用时,不要删除ptr

是一条重要的内存管理原则。它指的是在程序中,当一个指针(ptr)指向的内存被其他对象使用时,不要立即删除或释放该指针所指向的内存空间。

这个原则的背后是为了避免悬空指针和内存访问错误。如果在其他对象仍在使用该内存空间时删除ptr,那么其他对象在访问该内存时将会导致未定义的行为,可能会引发程序崩溃或数据损坏。

在实际开发中,我们可以通过以下几种方式来遵循这个原则:

  1. 合理的内存管理:在使用动态内存分配的情况下,需要确保在释放内存之前,所有对该内存的引用都已经结束。可以使用智能指针(如C++中的std::shared_ptr和std::unique_ptr)来管理内存,以确保在不再需要时自动释放内存。
  2. 使用引用计数:通过引用计数的方式来跟踪内存的使用情况。当其他对象需要使用该内存时,增加引用计数;当不再需要使用时,减少引用计数。只有当引用计数为0时,才删除ptr所指向的内存。
  3. 使用合适的作用域:在设计程序时,合理划分对象的作用域,确保在其他对象仍在使用内存时,不会意外删除ptr所指向的内存。可以通过合理的对象生命周期管理来实现。

总之,遵循"当内存被其他对象使用时,不要删除ptr"的原则是为了保证程序的内存安全和正确性。在实际开发中,我们需要合理管理内存、使用引用计数、划分合适的作用域等方式来遵循这个原则。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

第 12 章 动态内存

内存——定义在函数内的非 static对象进入其定义所在的程序块时创建,在离开块时销毁。 堆内存——存储动态分配的对象,即那些在程序运行时分配的对象。...动态对象不再使用时,必须由代码显式地销毁它们。 动态内存的使用很容易出问题。...也可以将智能指针绑定到一个指向其他类型的资源的指针上,但是我们必须提供自己的操作来代替 delete。 轻易不要使用一个内置指针来访问一个智能指针所负责的对象,因为我们无法知道对象何时会被销毁。...另外,对于没有良好定义的析构函数的类对象,也可以使用智能指针来管理,不管是否发生异常,智能指针类对象不再使用时,会调用相应的删除器函数进行内存回收。...使用 get()返回的指针时,最后一个对应的智能指针销毁后,get()返回的指针就变为无效了。 使用智能指针来管理不是 new分配的内存资源时,记住传递给它一个删除器。

1.4K40

【C++】智能指针详解

程序用堆来存储动态分配的对象即那些在程序运行时分配的对象动态对象不再使用时,我们的代码必须显式的销毁它们。...,如果我们不传递任何参数,对象就会进行值初始化 shared_ptr的拷贝和赋值 进行拷贝和赋值时,每个shared_ptr都会记录有多少个其他shared_ptr指向相同的对象。...shared_ptr还会自动释放相关联的内存 动态对象不再被使用时,shared_ptr类还会自动释放动态对象,这一特性使得动态内存的使用变得非常容易。...p指向的内存已经释放了 p和q指向相同的一块内部才能,由于是相互独立创建,因此各自的引用计数都是1,q所在的程序块结束时,q销毁,这会导致q指向的内存释放,p这时候就变成一个空悬指针,再次使用时...,将发生未定义的行为,p销毁时,这块空间会被二次delete 其他shared_ptr操作 可以使用reset来将一个新的指针赋予一个shared_ptr: p = new int(1024);/

90830
  • 彻底搞懂之C++智能指针

    所有实例均指向同一个对象,并共享对一个“控制块”(每当新的 shared_ptr 添加、超出范围或重置时增加和减少引用计数)的访问权限。 引用计数达到零时,控制块将删除内存资源和自身。...我简单的总结下就是:将基本类型指针封装为类对象指针(这个类肯定是个模板,以适应不同基本类型的需求),并在析构函数里编写delete语句删除指针指向的内存空间。...unique_ptr 是一个独享所有权的智能指针,它提供了严格意义上的所有权,包括: 1、拥有它指向的对象 2、无法进行复制构造,无法进行复制赋值操作。即无法使两个unique_ptr指向同一个对象。...但是可以进行移动构造和移动赋值操作 3、保存指向某个对象的指针,它本身被删除释放的时候,会使用给定的删除器释放它指向的对象 用法: std::unique_ptrp1(new int(5))...一旦最后一个所指向对象的shared_ptr销毁,所指向的对象就会被释放,即使此时有weak_ptr指向该对象,所指向的对象依然释放。

    3.6K10

    【C++11】 使用C++11解决内存泄露--智能指针

    众所周知,C#和java中不需要开发人员自己释放内存对象引用计数为零后.Net和Java虚拟机会对对象进行自动回收,从而防止内存泄露;但是C++语言中,在堆上分配的内存必须自己去管理,不用的时候要自己释放...C++11提供了智能指针,使用智能指针后不需要用户自己释放内存空间,一旦使用时对象超出了自己的生命周期,就会进行自动释放,从而有效解决了内存泄露的问题。...1.4 使用std::shared_ptr 的注意事项 std::shared_ptr注意事项如下: 不能使用同一个原始指针初始化多个std::shared_ptr 不要在函数实参中创建智能对象指针,主要是因为不同的编译器可能存在不同的约定...,因为调用顺序的不同可能引起内存泄露,因此在使用时应当先创建对象,在传入函数使用。...如果函数要返回this指针时,不要将this当做智能共享指针进行返回。因为如果使用同一个指针(this)构造了两个对象,析构时可能导致重复析构。

    69410

    C++(STL):03---智能指针之shared_ptr

    +1 四、shared_ptr的自动销毁对象内存机制 由上面可知,指向一个对象的最后一个shared_ptr对象销毁时,shared_ptr类会自动销毁此对象。...初始化另一个智能指针或者为另一个智能指针赋值 shared_ptr p(new int(42)); //引用计数变为1int *q=p.get(); //正确:使用q需要注意,不要让它管理的指针释放...{//新语句块shared_ptr(q); //用q初始化一个智能指针对象} //语句块结束之后,智能指针对象释放它所指的内存空间int foo=*p;//错误的,p所指的内存已经释放了 九...现在可以放心的改变对象的值了 十、异常处理 程序发生异常时,我们可以捕获异常来将资源正确的释放。...//此时抛出异常,未捕获delete ip; //在退出之前释放内存,此语句没有执行到,导致内存浪费} 十一、重置shared_prt类删除器 概念:前面介绍过,shared_ptr生命周期结束时,会调用默认的析构函数来释放

    1.6K20

    【笔记】《C++Primer》—— 第12章:动态内存

    减少到0时会自动析构delete其内部的指针,防止了内存泄漏 } 由于智能指针内有引用计数,所以可以让多个智能指针指向同个对象共享数据,并以此管理内存的释放 new是可以分配const对象的,且new...申请的动态内存不用用到时一定要用delete销毁,因为动态对象的生存期是直到delete销毁为止的,最常见的错误就是在函数里用局部指针new了一块内存后函数结束时没有delete造成内存泄漏 要注意一块内存只能...注意不要把智能指针和内置指针混用,让智能指针和内置指针都指向同一块内存容易导致引用问题,我们将无法确切得知合适这个对象应该被销毁 类似的也不要用智能指针的get函数提取内部的指针出来构造别的智能指针,因为这样引用计数无法传递...,get函数是用来适配一些无法传入智能指针的函数而出现的 程序跳出异常时,在delete前用new分配的内存不会自动释放,而智能指针仍然能在正确的时候释放 如果要给智能指针调用新的的删除器函数,需要在构造指针时第二个参数传入一个可调用对象...弱指针必须用shared_ptr来赋值或初始化,且使用时必须使用lock函数的返回值来解引用 由于是弱共享,对象的shared_ptr都被释放weak_ptr也可能不会被释放,这就是lock,use_count

    47710

    基础知识_Cpp

    一个类中含有对象指针时,如果把该类的一个对象复制给另一个对象,这时会导致两个对象中的指针指向同一块内存,此时一个对象销毁,可能会导致另一个对象中的指针指向的内容销毁。...vector使用时注意问题 *插入或删除中间一个元素后,原位置之后的迭代器会失效。 []与at()区别 []没有下标越界检查,效率更高,访问越界可能会segment fault。...int foo=*p;//访问了释放掉的内存。 3.get()返回的指针不要去delete、reset其他智能指针、初始化其他智能指针。...4.如果资源不是new申请到的,要注意给智能指针传递一个删除器。 5.不要两个指针相互引用,会造成内存泄漏,可以用weak_ptr解决。...指向一个给定对象unique_ptr销毁时,它所指向的对象销毁。

    1.9K30

    C++知识概要

    假设基类中采用的是非虚析构函数,删除基类指针指向的派生类对象时就不会触发动态绑定,因而只会调用基类的析构函数,而不会调用派生类的析构函数。...容器内部删除一个元素 顺序容器 erase 迭代器不仅使所指向被删除的迭代器失效,而且使被删元素之后的所有迭代器失效(list 除外),所以不能使用 erase(it++)的方式,但是erase...进程调用 malloc 等函数分配内存时,新分配的内存就被动态添加到堆上(堆扩张);利用 free 等函数释放内存时,释放的内存从堆中被剔除(堆缩减) 栈(stack) 栈又称堆栈,是用户存放程序临时创建的局部变量...某个时刻只能有一个 unique_ptr指向一个给定对象 unique_ptr 销毁时,它所指向的对象销毁。...,一旦最后一个指向对象的 shared_ptr 销毁,对象就会被释放,即使有 weak_ptr 指向对象对象还是会被释放。

    1.1K20

    谁创建谁销毁,谁分配谁释放——JNI调用时内存管理

    一个重要的问题是JVM不会帮我们管理Native Memory所分配的内存空间的,本文就主要介绍如何在JNI调用时,对于Java层和Native层映射对象内存管理策略。 1....层所持有的Java对象,前提是这个对象除了Weak Reference以外,没有其他引用持有。...之后我们创建全局引用,避免Local Reference在Native Method结束之后回收,而全局引用在析构函数中被删除,这样就保证了Java Heap中的对象释放,保持Native层和Java...为了避免因为遗漏delete而造成的内存泄露,C++标准库(STL)提供了auto_ptr和shared_ptr,本质上都是用来确保对象的生命周期结束时,堆上分配的内存释放。...在这个消息循环的最后,假如这个object没有其他类或容器retain过,那么它将自动释放掉。

    4.4K60

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

    程序员每次new出来的内存块都需要自己使用delete进行释放,流程复杂可能会导致忘记释放内存而造成内存泄漏。而智能指针也致力于解决这种问题,使程序员专注于指针的使用而把内存管理交给智能指针。...有多个指针指向同一个基础对象时,如果某个指针delete了该基础对象,对这个指针来说它是明确了它所指的对象释放掉了,所以它不会再对所指对象进行操作,但是对于剩下的其他指针来说呢?...运行结果是输出ptr2时并不是期待的1,因为1已经被删除了。这个过程是这样的: ? ? ? 从图可以看出,错误的产生来自于ptr1的”无知“:它并不知道还有其他指针共享着它指向的对象。...当然是只有一个指针指向基础对象的时候,这时通过该指针就可以大大方方地把基础对象删除了。 3.什么是引用计数 如何来让指针知道还有其他指针的存在呢?这个时候我们该引入引用计数的概念了。...一旦一个对象通过调用new分配出来,记录谁拥有这个对象是很重要的,因为其所有者要负责对它进行delete。但是对象所有者可以有多个,且所有权能够传递,这就使得内存跟踪变得困难。

    2.2K41

    【C++高阶】:智能指针的全面解析

    动态对象的生存期由程序来控制,也就是说,动态对象不再使用时,我们的代码必须显式地销毁它们。...unique_ptr销毁(例如离开其作用域)时,它所指向的对象也会被自动删除。...多个shared_ptr可以指向同一个对象,并且每个shared_ptr持有一个引用计数。最后一个指向某个对象的shared_ptr销毁或重置时,该对 象才会被删除。...以下情况之一发生时,对象销毁并释放其内存: 拥有该对象的最后一个shared_ptr销毁; 通过reset()函数将shared_ptr赋值为另一个指针。 2....如果引用计数在栈区,那么一个shared_ptr改变指向或者离开作用域时,就无法通知其他shared_ptr更新引用计数了。

    800

    深入Go:垃圾回收的演进

    垃圾回收主要有「引用计数」与「追踪」的机制: 引用计数(Reference Counting):给每一个对象增加一个计数器,每当该对象引用/解除引用时,则计数器自增/自减1;该计数器归零时,则该对象应该被回收...用户新创建了对象——该对象一直保持白色,最后可能错误地回收; 用户将一个白色对象从灰色对象解除引用,并使一个黑色对象引用它——该白色对象不会被扫描到,因为黑色对象意味着相关引用对象已经扫描完毕,从而该白色对象错误地回收...: 用户新创建的对象,直接标记为灰色,避免了错误回收; 白色对象的父节点从灰色对象改为黑色对象时,该对象标记为灰色,也避免了错误回收。...代码示例如下: 删除写屏障的可靠性来源于其满足弱三色不变性: 黑色对象指向的白色对象必须包含一条从灰色对象经由多个白色对象的可达路径 从而保证了白色对象删除用时,其自身和子节点总能在标记阶段标记为黑色...*slot) { markGray(*slot) // [删除写屏障]删除用时解除引用的对象标记灰色 } if isCurrentStackGray() { markGray

    1.4K10

    Google C++ 编程风格指南(四):来自 Google 的奇技

    动态分配出的对象的所有主是一个对象或函数,后者负责确保当前者无用时就自动销毁前者。所有权有时可以共享,那么就由最后一个所有主来负责销毁它。甚至也可以不用共享,在代码中直接把所有权传递给其它对象。...std::unique_ptr 是 C++11 新推出的一种智能指针类型,用来表示动态分配出的对象的「独一无二」所有权; std::unique_ptr 离开作用域,对象就会被销毁。...std::shared_ptr 同样表示动态分配对象的所有权,但可以共享,也可以被复制;对象的所有权由所有复制者共同拥有,最后一个复制者销毁时,对象也会随着销毁。...如果其他地方要使用这个对象,最好传递它的拷贝,或者传递一个不用改变所有权的指针或引用。...如果确实要使用共享所有权,倾向于使用 std::shared_ptr不要在新代码中使用 scoped_ptr `` ,除非你必须兼容老版本的C++。

    70310

    善用shared_ptr,远离内存泄漏(文末福利)

    shared_ptr允许多个指向同一个对象指向对象的最后一个shared_ptr销毁时,该对象也就会自动销毁。因此,善用shared_ptr,能够远离内存泄漏。...哪些操作会改变计数 我们都知道,引用计数为0时,shared_ptr所管理的对象自动销毁(拥抱智能指针,告别内存泄露),那么哪些情况会影响引用计数呢?...存放于容器中的shared_ptr 如果你的容器中存放的是shared_ptr,而你后面又不再需要它时,记得使用erase删除那些不要的元素,否则由于引用计数一直存在,其对象将始终得不到销毁,除非容器本身销毁...*/ std::shared_ptr sp2(p); return 0; } 这样会导致两个shared_ptr管理同一个对象其中一个销毁时,其管理的对象会被销毁...*/ delete p;/*不要这样做*/ return 0; } 如果对象不是new分配的,请传递删除器 与unique_ptr类似,它可以指定删除器,默认是使用delete。

    1.8K10

    整理了70道C语言与C++常见问答题

    说明:很多时候一个变量,只是声明不分配内存空间,直到具体使用时才初始化,分配内存空间, 如外部变量。...「注意」:有多个指针指向同一段内存时,某个指针释放这段内存可能会导致其他指针的非法操作。因此在释放前一定要确保其他指针不再使用这段内存空间。...「注意」:delete和free调用后,内存不会立即回收,指针也不会指向空,delete或free仅仅是告诉操作系统,这一块内存释放了,可以用作其他用途。...pb_; 改为weak_ptr pb_; 运行结果如下,这样的话,资源B的引用开始就只有1,pb析构时,B的计数变为0,B得到释放,B释放的同时也会使A的计数减一,同时pa析构时使A的计数减一,那么...「注意」:有类中有指针类型的成员变量时,一定要重写拷贝构造函数和赋值运算符,不要使用默认 的。 41 在C++中,使用malloc申请的内存能否通过delete释放?

    3K01

    C++智能指针

    原理: 将我们分配的动态内存都交给有生命周期的对象来处理,对象过期时,让它的析构函数删除指向的内存。...auto_ptr C++98的智能指针模板,其定义了管理指针的对象,可以将new获得(直接或间接获得)的地址赋值给这种对象对象过期时,其析构函数会用delete来释放内存。...3.除非自己知道后果,不要把auto_ptr 智能指针赋值给同类型的另外一个智能指针,解释如下。 4.C++11 后auto_ptr 已经“抛弃”,已使用unique_ptr替代!...如果有一种方式,可以记录引用特定内存对象的智能指针数量,复制或拷贝时,引用计数加1,智能指针析构时,引用计数减1,如果计数为零,代表已经没有指针指向这块内存,那么我们就释放它!... sp5(new T(), D()); //定义shared_ptr,指向类型为T的对象,接受一个D类型的删除器,使用D删除器来释放内存 数组对象的管理: shared_ptr

    43820

    GO语言学习笔记 | 垃圾回收机制剖析

    ” 如图所示,假设应用程序在堆上申请了A-J共10个内存对象。其中可以程序中的变量直接访问的只有对象A和B(分别被变量a、b直接访问),因此根对象只有A和B。其他内存对象都是间接访问,不是根对象。...对比三色标记和原始的标记清除算法 在原始的算法中,使用新增黑色对象对白色对象的引用时,将白色对象置为黑色(需要先递归处理白色对象的下游),也能避免活跃内存对象错误回收。...★删除写屏障的基本含义:Mutator在删除一个内存对象A到另一个内存对象B的指向时(在有向图中删除A->B这条边),引入内存屏障,将内存对象B置灰。...,也可能指向nil } 我们看下删除写屏障如何保证弱三色不变性: 先假设栈对象也开启了写屏障 仍然以前面的例子来说明: 删除B->D这条边时,触发删除写屏障。...再引入栈对象不启用写屏障这一限制条件: 对于删除写屏障算法来说,如果栈对象不开启插入写屏障,在回收过程中,如果把一个对象从栈对象直接下游移动到其他对象(黑色对象)直接下游,则可能不会被发现,最终导致错误回收

    1.1K20

    动态内存与智能指针

    int,即,值为0 shared_ptr 进行拷贝和赋值操作时,每个shared_ptr 都会记录有多少个其他的shared_ptr 指向相同的对象 auto p = make_shared...指向一个对象的最后一个 shared_ptr 销毁时,shared_ptr 类就会自动销毁此对象。 shared_ptr 并不是万能的,也会出现内存泄漏的问题。这种情况一般出现在容器中。...定位new允许我们传递额外的参数给到new,在此例子中我们传递一个标准库中的nothrow 对象,告知它在内存不足的时候不要抛出异常。...我们可以将智能指针绑定到一个指向其他类型的资源的指针上面,但是为了这样做,必须提供自己的操作来代替delete 不要混合使用普通指针和智能指针。...unique_ptr 销毁时,它所指向的对象也会被销毁 unique_ptr 不支持拷贝操作,没有类似 make_shared 的操作。

    84420

    智能指针在面试中得重要地位!

    ,由调用者复制删除 //std::unique_ptr析构时,又会自动对其所指向的对象实施delete //std::unique_ptr析构时,又会自动对其所指向的对象实施delete class.../** std::shared_ptr不得不使用更多的内存,但是该部分内存却不属于 std::shared_ptr对象的一部分,它位于堆上:控制块 std::shared_ptr 指涉到 T 型别的对象的指针...----------------> T型别对象 指涉到控制块的指针 ------------------------> 控制块 引用计数 弱计数 其他数据(例如,自定义删除器,分配器等) 控制块的创建遵循以下规则...//用处一:缓存的对象不再有用时将其删除 //用处一:缓存的对象不再有用时将其删除 class WidgetID{ }; std::unique_ptr loadWidget...并且,B持有的指针不会影响A的引用计数 因此 std::shared_ptr不再指涉到A时,不会阻止A析构 */ // 要点速记 // • 使用 std: :weak_ptr 来代替可能空悬的 std

    1K20

    C++内存管理(建议收藏)

    例如,一个嵌入在其他对象中的对象,他的清除需要其他对象来在清除的时候保证。外面的对象看作嵌入类的所有者。   ...这点在当封装对象(Encapsulating Object)在栈中建立或者嵌入在其他对象中的时候非常明显。但是对那些动态申请的对象呢?不要急!...看似可以使用,但如果B对象的析构函数用时,则地址2000处的字符串“C++”已经内存中抹去,而A对象仍然指向地址2000。...这时,如果我们写下这样的代码:cout<<A<<endl;或是等待程序结束,A对象的析构函数用时,A对象的数据能否显示出来呢?只会是乱码。...已经破坏了。大家从运行结果上可以看到,我们使用cout<<test1时,一点反应也没有。而在test1的析构函数用时,显示是这样:“这个字符串将被删除:”。

    3.1K41
    领券