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

在指向同一对象的两个指针上调用delete

这两个指针都指向同一个对象,因此在其中一个指针上调用 delete 语句会导致另一个指针也失效。为了避免这种情况,您应该确保在删除其中一个指针后,不再使用另一个指针访问该对象。如果您需要删除该对象,可以使用 delete[] 语句来删除数组中的对象,或者使用 delete 语句来删除单个对象。如果您需要保留对同一对象的访问,则应该创建一个指向该对象的新的指针,并使用 new 运算符来动态分配内存。

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

相关·内容

C++ this指针:用于成员函数中指向调用该函数对象

C++中this指针是一个指向当前对象指针成员函数中,可以使用this指针来访问调用该函数对象成员变量和成员函数。...二、作为返回值this指针 this指针可以作为返回值返回。这种情况下,返回指向调用该函数对象指针。为了实现这个功能,需要将返回类型设置为类引用或指针类型。...函数内部,返回指向调用该函数对象指针。...这里使用了*this来访问调用该函数对象。 三、作为函数参数this指针 this指针也可以作为函数参数传递。这种情况下,可以函数内部访问其他对象成员变量和成员函数。...getName函数内部,使用了this指针访问调用该函数对象成员变量name。

19940

智能指针模板类

智能指针是行为类似于指针对象,但这种对象还有其他功能。使用指针指向一块新申请内存过程中,有时忘记释放新申请内存,导致内存泄漏。为了防止该问题发生,C++提供了智能指针模板类。...其思想就是将常规指针变成一个类对象,该对象主要实现常规指针功能,当该对象过期时候,会自动调用其析构函数,析构函数中完成内存释放操作。...有关智能指针注意事项 常规指针使用过程中两个指针可能会指向同一对象,这是不能接受,因为程序结束时候会存在删除同一对象两次问题,如下例: std::string* ps (new...常规指针基础增加了所有权概念,对于特定对象,只有一个指针可以拥有它,这样只有拥有对象智能指针才能删除该对象。...如何选择合适指针 程序要使用多个指向同一对象指针 使用shared_ptr。 程序不需要多个指向同一对象指针 使用unique_ptr。

62020

C++基础 智能指针

对于普通 局部变量(非静态局部变量),当离开它作用域时,操作系统会自动将其释放。类对象释放时候是会自动调用该类析构函数。...于是我们就想:如果是Test *t不是一个普通指针变量,而是一个类对象的话,并且析构函数中实现了释放动态内存步骤,那么只要该指针变量一退出作用域时就会调用析构函数,达到了释放动态内存目的。...可视作auto_ptr替代品 持有对象**独有权**,同一时刻只能有一个unique_ptr指向给定对象 shared_ptr 允许多个该智能指针**共享**堆中分配内存(指向同一对象),通过*...先来看如下代码: auto_ptr px(new int(8)); auto_ptr py; py = px; 上述赋值语句将两个指针指向同一内存地址,析构时可能会被两个对象各自...如果程序中不需要使用多个指向同一对象指针,则可使用unique_ptr 如果函数使用new分配内存,并返回指向该内存指针,将其返回类型声明为unique_ptr是不错选择。

60020

【C++ 语言】智能指针 引入 ( 内存泄漏 | 智能指针简介 | 简单示例 )

多个指针指向同一对象 ; 当最后一个智能指针销毁时 , 对象销毁 ; ② weak_ptr : 为了弥补 shared_ptr 缺陷而引入智能指针 ; ③ unique_ptr : 指向对象所有权...互斥 , 同一时间 , 一个 对象 只能有一个 unique_ptr 智能指针 指向它 ; ④ auto_ptr ( 已弃用 ) : 该智能指针 C++ 11 标准中 已弃用 , 但是为了向低版本兼容...: 该智能指针对象处于 栈内存中 // 智能指针释放 : 函数执行完毕后 , 就会调用智能指针对象析构方法 // 判定引用计数 : 智能指针对象析构方法内部就会判定智能指针 操作对象 引用计数...// 释放两个智能指针后 , student 对象引用计数又变成了 0 // 两个智能指针会被回收 , 回收智能指针时 , 会做判定 , 当 对象引用计数为 0 时 // 自动调用对象析构函数...: shared_ptr , 该智能指针内部实现了引用计数 , 多个共享智能指针指向同一对象时 // 有 N 个 共享 智能指针同一对象 , 其引用计数为 N return 0; } 运行结果

33410

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

unique_ptr 是一个独享所有权智能指针,它提供了严格意义所有权,包括: 1、拥有它指向对象 2、无法进行复制构造,无法进行复制赋值操作。即无法使两个unique_ptr指向同一对象。...(1)如果程序要使用多个指向同一对象指针,应选择shared_ptr。...这样情况包括: 有一个指针数组,并使用一些辅助指针来标示特定元素,如最大元素和最小元素; 两个对象包含都指向第三个对象指针; STL容器包含指针。...智能指针错误用法 1、使用智能指针托管对象,尽量不要在再使用原生指针 很多开发同学(包括我在内)最开始使用智能指针时候,对同一对象会混用智能指针和原生指针,导致程序异常。...std::shared_ptr e = std::make_shared(); 5、智能指针只能管理堆对象,不能管理栈对象对象本身在出栈时就会被自动销毁,如果将其指针交给智能指针,会造成对象二次销毁

3.4K10

c浅拷贝和深拷贝区别_js中深拷贝和浅拷贝区别

即对指针name拷贝后会出现两个指针指向同一个内存空间。...两个对象指针成员所指内存不同。...总结:浅拷贝只是对指针拷贝,拷贝后两个指针指向同一个内存空间,深拷贝不但对指针进行拷贝,而且对指针指向内容进行拷贝,经深拷贝后指针指向两个不同地址指针。...再说几句: 当对象中存在指针成员时,除了复制对象时需要考虑自定义拷贝构造函数,还应该考虑以下两种情形: 1.当函数参数为对象时,实参传递给形参实际是实参一个拷贝对象,系统自动通过拷贝构造函数实现...; 2.当函数返回值为一个对象时,该对象实际是函数内对象一个拷贝,用于返回函数调用处。

70830

《C++Primer》第十九章

和其他operator函数不同,这两个函数并没有重载new表达式或者delete表达式。实际我们根本无法自定义new表达式或者delete表达式行为。...当只传入一个指针类型实参时,定位new表达式构造对象但是不分配内存,它允许我们一个特定、预先分配内存地址构造对象。...尽管定位new与allocatorconstruct非常相似,但是有一个重要区别:我们传给construct指针必须指向同一个allocator对象分配空间,但是传给定位new指针无须指向operator...将成员函数用作可调用对象 要想通过有一个指向成员函数指针进行函数调用,必须首先利用.*或者->*运算符将该指针绑定到特定对象。...因此与普通函数指针不同,成员指针不是一个可调用对象,这样指针不支持函数调用运算符。 因为成员指针不是可调用对象,因此我们不能直接将一个指向成员函数指针传递给算法。

1.3K10

C++智能指针「建议收藏」

,主要用到了这两点: 智能指针体现在把裸指针进行了面向对象封装,构造函数中初始化资源地址,析构函数中负责释放资源 利用栈对象出作用域自动析构这个特点,智能指针析构函数中保证释放资源。...就好比SmartPtr* ptr = new SmartPtr();这段代码中,堆空间定义一个智能指针,这依然需要我们手动进行delete,否则堆空间对象无法释放,因为堆空间对象无法利用出作用域自动调用析构函数...SmartPtr ptr1(new int); SmartPtr ptr2(ptr1); return 0; } 以上代码运行时,由于ptr2拷贝构造时默认是浅拷贝,两个对象底层指针指向同一份资源...,对象析构时,会出现同一资源释放两次错误(释放野指针),这里需要解决两个问题: 智能指针浅拷贝 多个智能指针指向同一个资源时候,怎么保证资源只释放一次,而不是每个智能指针都释放一次 不带引用计数智能指针主要包括...shared_ptr和weak_ptr基类_Ptr_base中,有两个和引用计数相关成员,_Ptr是指向内存资源指针,_Rep是指向new出来计数器对象指针 class shared_ptr

42010

C++面试题之浅拷贝和深拷贝区别

即对指针name拷贝后会出现两个指针指向同一个内存空间。...两个对象指针成员所指内存不同。...总结:浅拷贝只是对指针拷贝,拷贝后两个指针指向同一个内存空间,深拷贝不但对指针进行拷贝,而且对指针指向内容进行拷贝,经深拷贝后指针指向两个不同地址指针。...再说几句: 当对象中存在指针成员时,除了复制对象时需要考虑自定义拷贝构造函数,还应该考虑以下两种情形: 1.当函数参数为对象时,实参传递给形参实际是实参一个拷贝对象,系统自动通过拷贝构造函数实现...; 2.当函数返回值为一个对象时,该对象实际是函数内对象一个拷贝,用于返回函数调用处。

35620

C++ new与delete使用规范

C++动态内存管理是通过new和delete两个操作来完成,即用new来申请空间,用delete来释放空间。使用new和delete时,注意以下原则。...从程序输出可以看出,指针one所指向空间释放后,为指针p申请空间就是原来one所指向空间。...由此可知,多次释放同一块内存空间,即使不导致程序运行中断,也会破坏环境,使指针与所对应空间隶属关系出现混乱,从而导致逻辑错误。大型程序设计中,这种逻辑错误查找会变得十分费时费力。...**注意:**当指针p值为NULL时,多次使用delete p并不会带来麻烦,因为释放空指针空间实际不会导致任何操作。所以,将“不用”指针设置为NULL是一个好编程习惯。...当使用delete[]释放内存空间时,会逐个调用对象析构函数并完成最终内存空间释放。使用delete释放对象数组时,则只会调用单个对象析构函数,造成内存泄漏。

1.3K41

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

具体而言,复制对象时,副本和原对象指向同一存储区域,如果通过一个副本改变其所指值,则通过另一对象访问值也会改变.所不同是,智能指针能够对内存进行进行自动管理,避免出现悬垂指针等情况。...当有多个指针指向同一个基础对象时,如果某个指针delete了该基础对象,对这个指针来说它是明确了它所指对象被释放掉了,所以它不会再对所指对象进行操作,但是对于剩下其他指针来说呢?...智能指针将一个计数器与类指向对象相关联,引用计数跟踪共有多少个类对象共享同一指针。...然后增加右操作数所指对象引用计数(为何增加:因为此时做操作数指向对象即右操作数指向对象)。 析构函数:调用析构函数时,析构函数先使引用计数减1,如果减至0则delete对象。...如期,离开大括号后,共享基础对象指针从3->2->1->0变换,最后计数为0时,pa对象delete,此时使用getX()已经获取不到原来值。

2.1K41

《C++Primer》第十二章 动态内存

42); // p指向对象只有p一个引用者 auto q(p); // p和q指向同一对象,此对象两个引用者 每个shared_ptr都有一个与之关联引用计数器reference count,...delete内存:这种情况下内存再也不可能归还给自由空间,也就是我们所说“内存泄漏”问题 使用已经释放掉对象:通过释放内存后将指针置为空,有时可以检测出这种问题 同一块内存释放两次:当有两个指针指向相同动态分配对象时可能发生这种错误...然而可能有多个指针指向同一块内存: int *p(new int(42)); // p指向动态内存 auto p = q; // p和q指向同一块内存 delete p; // p和q均变得无效 p...: unique_ptr u1:空unique_ptr,可以指向类型为T对象,u1会调用delete来释放指针 unique_ptr u2:同上,但是会调用D调用对象来释放它指针...如果我们delete一个指向数组指针时忽略了方括号,或者delete一个指向单一对象指针时使用了方括号,其行为是未定义。 3.

1.3K10

C++ new 与 delete 使用规范

从程序输出可以看出,指针one所指向空间释放后,为指针p申请空间就是原来one所指向空间。...由此可知,多次释放同一块内存空间,即使不导致程序运行中断,也会破坏环境,使指针与所对应空间隶属关系出现混乱,从而导致逻辑错误。大型程序设计中,这种逻辑错误查找会变得十分费时费力。...**注意:**当指针 p 值为 NULL 时,多次使用 delete p 并不会带来麻烦,因为释放空指针空间实际不会导致任何操作。所以,将“不用”指针设置为 NULL 是一个好编程习惯。...,delete[] 调用了三次析构函数,完成了对象数组释放。...当使用delete[]释放内存空间时,会逐个调用对象析构函数并完成最终内存空间释放。使用 delete 释放对象数组时,则只会调用单个对象析构函数,造成内存泄漏。

74410

27.C++- 智能指针

智能指针 C++库中最重要类模板之一 智能指针实际是将指针封装在一个类里,通过对象来管理指针....; //打印数值1 一片堆空间只属于一个智能指针对象(因为多个指向相同地址智能指针调用析构函数时,会出现bug) 当auto_ptr被拷贝或赋值后,则自身指针指向地址会被抢占...可以发现在调用p1=p2时, 首先会delete p1对象类成员指针(调用~Test(1)析构函数),然后将p2对象类成员指针赋值给p1(p1=0x8db1018), 最后修改p2指针地址为NULL...STL中智能指针shared_ptr(需要C++11支持) 带有引用计数机制,支持多个指针对象指向同一片内存(实现共享) 提供swap()成员函数,用来交换两个相同类型对象,比如:   shared_ptr...,该模板类析构时,不会自动摧毁所指向对象(需要手工delete) -QSharedPointer 头文件 带有引用计数机制,支持多个指针对象指向同一片内存(实现共享)

842100

智能指针探究

这就是为什么调用delete mptr;来删除指向对象 需要注意是,这段代码并不会调用指向对象析构函数。析构函数是delete mptr;这一行被调用时自动调用。...事实,当你主线程中使用delete删除对象p时,它会释放该对象所占用内存。但是,这并不意味着该内存立即被操作系统回收或被其他程序使用。...比如我用智能指针托管数组的话,那delete就不行,得用delete[] 再比如我让它管理不是内存资源,而是文件资源,那释放文件也绝对不可能用delete释放 所以我们除了智能指针堆内存外,怎么正确指导智能指针来正确删除呢...先讲讲智能指针内部是咋回事吧 unique_ptr shared_ptr 一个不带计数,一个带计数 他们两个都是可以带自定义删除器 看他们源码 ~unique_ptr(){ 是一个函数对象调用...这个 lambda 表达式接受一个 int 指针作为参数,并在其函数体中使用 delete[] 运算符来释放该指针指向数组 当 ptr1 被销毁时,它会调用这个 lambda 表达式来释放其所指向数组

6610

C++智能指针简介

1.智能指针由来 C++中,动态内存管理是通过一对运算符来完成,new用于申请内存空间,调用对象构造函数初始化对象并返回指向对象指针。...delete接收一个动态对象指针调用对象析构函数销毁对象,释放与之关联内存空间。...总的来说,使用引用计数有如下两个目的: (1)节省内存,提高程序运行效率。如何很多对象拥有相同数据实体,存储多个数据实体会造成内存空间浪费,所以最好做法是让多个对象共享同一个数据实体。...辅助类将引用计数与智能指针指向对象封装在一起,引用计数记录有多少个智能指针指向同一对象。...4.智能指针实现模板 智能指针管理对象,本质是以栈对象来管理堆对象《Effective C++》条款13中称之为资源获取即初始化(RAII,Resource Acquisition Is Initialization

1.1K30

CC++面试常问题集(2)

假设基类中采用是非虚析构函数,当删除基类指针指向派生类对象时就不会触发动态绑定,因而只会调用基类析构函数,而不会调用派生类析构函数。...多态 同一操作作用于不同对象,可以有不同解释,产生不同执行结果,这就是多态性。简单说:就是用基类指针或引用指向子类对象。...C++多态性具体体现在运行和编译两个方面: (1)程序运行时多态性通过继承和虚函数来体现; (2)程序编译时多态性体现在函数和运算符重载; 虚函数 使用virtual关键字声明是虚函数...就是基类指针或引用有可能指向不同派生类对象,对于非虚函数,执行时实际调用该函数对象类型即为该指针或引用静态类型(基类类型);而对于虚函数,执行时实际调用该函数对象类型为该指针或引用所指对象实际类型...;而引用跟原来变量实质同一个东西,只不过是原变量一个别名而已,引用变量内存单元保存是被引用变量地址。

1.1K10

【C++深度探索】全面解析多态性机制(一)

1.什么是多态 C++中,多态(Polymorphism)是指通过基类指针或引用来访问派生类对象一种机制。简单来说,它允许我们基类类型指针或引用上调用派生类对象成员函数。...通过使用基类指针或引用指向派生类对象,并调用该虚函数,实际在运行时会根据对象实际类型调用合适函数。...: 通过使用基类引用p指向派生类对象,并调用虚函数BuyTicket(),实际在运行时会根据对象实际类型调用合适函数来实现多态,也就是不同对象完成同一个行为会有不同状态——普通人买票全价,学生买票半价...只有派生类Student析构函数重写了Person析构函数,delete对象调用析构函数,才能构成多态,才能保证p1和p2指向对象正确调用析构函数。...结果如下: 这里要注意派生类析构调用完之后会自动调用基类对象析构函数,所以这里基类析构函数调用了两次 我们可以对比一下,当没有实现多态时,对于delete对象调用析构函数是不会根据所指向对象调用相应析构函数

5310

new和delete使用规范

C++动态内存管理是通过new和delete两个操作来完成,即用new来申请空间,用delete来释放空间。使用new和delete时,注意以下原则。...从程序输出可以看出,指针one所指向空间释放后,为指针p申请空间就是原来one所指向空间。...由此可知,多次释放同一块内存空间,即使不导致程序运行中断,也会破坏环境,使指针与所对应空间隶属关系出现混乱,从而导致逻辑错误。大型程序设计中,这种逻辑错误查找会变得十分费时费力。...注意:当指针p值为NULL时,多次使用delete p并不会带来麻烦,因为释放空指针空间实际不会导致任何操作。所以,将“不用”指针设置为NULL是一个好编程习惯。...(2)当类成员中有指针变量时,构造函数中用new申请空间并且析构函数中用delete释放空间是一种“标准”、安全做法。 例如下面的程序。

56420

C++智能指针

1.智能指针由来 C++中,动态内存管理是通过一对运算符来完成,new用于申请内存空间,调用对象构造函数初始化对象并返回指向对象指针。...delete接收一个动态对象指针调用对象析构函数销毁对象,释放与之关联内存空间。...如此做,指针指针,辅助类对象与被引用对象关系如下图所示: image.png 辅助类将引用计数与智能指针指向对象封装在一起,引用计数记录有多少个智能指针指向同一对象。...然后增加右操作数所指对象引用计数(为何增加:因为此时做操作数指向对象即右操作数指向对象)。 (4)完成析构函数:调用析构函数时,析构函数先使引用计数减1,如果减至0则delete对象。...如果ps和vocation是常规指针,则两个指针指向同一个string对象。这是不能接受,因为程序将试图删除同一对象两次,一次是ps过期时,另一次是vocation过期时。

3.5K30
领券