new和delete的使用与常见错误

从婴儿学步到工业级应用:VLA的‘隐式标定‘原理通俗图解 本文深入解析VLA(Vision-Language-Action)模型的'隐式标定'原理,通过类比婴儿学习机制,揭示其如何替代传统手眼标定技术。文章对比了工业机器人传统标定与VLA数据驱动方法的差异,并可视化神经网络注意力机制,展示其在空间关系编码上的突破性进展。最后探讨了VLA在工业应用中的优势与混合架构解决方案。 阅读详情

c++中new和delete的使用方法

new和delete运算符用于动态分配和撤销内存的运算符

new用法:

          1.     开辟单变量地址空间

               1)new int;  //开辟一个存放数组的存储空间,返回一个指向该存储空间的地址.int *a = new int 即为将一个int类型的地址赋值给整型指针a. 

               2)int *a = new int(5) 作用同上,但是同时将整数赋值为5

          2.     开辟数组空间

               一维: int *a = new int[100];开辟一个大小为100的整型数组空间

               二维: int **a = new int[5][6]

               三维及其以上:依此类推.

         一般用法: new 类型 [初值]

delete用法:

          1. int *a = new int;

               delete a;   //释放单个int的空间

          2.int *a = new int[5];

               delete [] a; //释放int数组空间

          要访问new所开辟的结构体空间,无法直接通过变量名进行,只能通过赋值的指针进行访问.

          用new和delete可以动态开辟,撤销地址空间.在编程序时,若用完一个变量(一般是暂时存储的数组),下次需要再用,但却又想省去重新初始化的功夫,可以在每次开始使用时开辟一个空间,在用完后撤销它.

 

C++ delete错误

1. 指针通过 new 或 new[] ,向系统“申请”得到一段内存空间,这段 内存空间必须在不需要将它释放了。
int * p = new int [ 100 ];

int girl[ 100 ]; 
 
p
= girl; 
 
delete [] p;
   灾难在 delete [] p 时发生。 我们原意是要释放p最初通过new int[100] 而得到的内存空间,但事实上,p那时已经指向girl[100] 了。结果,第一、最初的空间并没有被释放。第二、girl[100] 本由系统自行释放,现在我们却要强行释放它。

2. 一个指针被删除时,应指向最初的地址
当一个指针通过 +,- 等操作而改变了指向;那么在释放之前,应确保其回到原来的指向。如下所示:在 delete [] p 时,p指向的是第二个元素,结果该释放将产生错位:第一个元素没有被释放,而在最后多删除了一个元素。
int * p = new int [ 3 ];

* p = 1 ;
cout
<< * p << endl;

p
++ ; // p的指向改变了,指向了下一元素

* p = 2 ;
cout
<< * p << endl;

delete [] p;
// 错误的释放

p -- ;

delete [] p;

但当我们的指针指向变化很多次时,在释放前要保证一步不错地一一退回,会比较困难。所以另一方法是在最初时“备份”一份。在释放时,直接释放该指针即可。
int * p = new int [ 3 ];

int * pbak = * p; // 备份

// 移动 p

……

delete [] pbak;
// 释放
由于 pbak正是指向p最初分配后的地址,我们删除 pbak, 就是删除p最初的指向。此时我们不能再删除一次p。这也就引出new / delete 及 new[] / delete[] 在本章的最后一个问题。

3. 已释放的空间,不可重复释放
第一种最直接:
int * p = new int ( 71 );

cout
<< * p << endl; 

delete p;
// OK!

delete p;
// ERROR! 重复删除p

第二种为重复删除同一指向的多个指针
int * p1 = new int ( 71 );

int * p2 = p1; // p2和p1 现在指向同一内存地址

cout
<< * p1 << endl;

cout
<< * p2 << endl;

delete p1;
// OK

delete p2;
// ERROR! p2所指的内存,已通过delete p1而被释放,不可再delete一次
同样的问题,如果你先删除了p2 ,则同样不可再删除p1
delete p2; // OK

delete p1;
// ERROR

第三种为删除指向某一普通变量的指针
int a = 100 ;

int * p = & a;

delete p;
// ERROR

p 不是通过new 得到新的内存空间,而是直接指向固定变量a。所以删除p等同要强行剥夺a的固有空间,会导致出错。

如何消除这一严重错误呢?
第一种方法是把指针正确地 "倒 "回原始位置:
 
为了您的安全,请只打开来源可靠的网址

打开网站    取消

来自: http://hi.baidu.com/bellgrade/blog/item/68d58700a65a2e0a1d9583c9.html
基于SpringBoot+SpringCloud+Vue前后端分离项目实战 --开篇 如何高效学习Java? 毕业设计项目应该怎么做?入门实战项目应该怎么做? 做Java开发都应该学习哪些框架技术? 我想来跟你聊聊为什么要学习此专栏?我们经常说,看一个事儿千万不要直接陷入细节里,你应该先鸟瞰其全貌,这样能够帮助你从高维度理解问题。同样,当你迷茫想努力没有方向时,最事半功倍的方法是:找人带你! 因为过来人,更懂得如何学、如何做、如何少走弯路! 那今天就给大家带来一门专栏课程,由 天罡gg 和 经海路大白狗 两位实力大牛合力打造的一款专栏,可以让你从0到1快速拥有企业级规范的项目实战经验! 阅读详情

相关推荐

【Python爬虫案例教学】超简洁代码采集原神所有角色信息

(。・∀・)ノ゙嗨 大家好,这里是池鱼

xiaoyuan_____的博客 2421

new 的四种使用方法,以及特性

new 的四种使用方法

思泽之思 3044

一个开源的AI数据分析工具,与数据对话,一键生成SQL、图表、表格、报告和智能商业分析。

Wren AI是一个开源的AI智能代理,让用户能够跟数据对话,实现从文本到SQL的转换,还能生成图表、电子表格、报告以及商业智能分析。它支持多种语言,能深入挖掘数据价值,提供智能数据探索功能,通过语义索引和精心设计的界面,让用户无需写代码即可获取洞察。Wren AI采用独特的架构,包含Wren UI、Wren AI Service和Wren Engine三大核心服务,可部署在本地或云端,助力团队高效、安全地解锁数据潜力。

AI_Charlotte的博客 4498

C++的new[网页摘抄]

1、new int[] new int[] 是创建一个int型数组,数组大小是在[]中指定,例如: int * p = new int[3]; //申请一个动态整型数组,数组的长度为[]中的值 2、new int() new int()是创建一个int型数,并且用()括号中的数据进行初始化,例如: int *p = new int(10); // p指向一个值为10的int数。 int *a = new int(10); //动态创建整型数,无参数是 * a=0,有参数则 ...

wo871427008的博客 868

保姆级教程:用Ansys Workbench找出BGA焊点最容易坏的位置(附热循环+振动分析)

本文提供了一份详细的Ansys Workbench教程,指导如何通过热循环和振动分析找出BGA焊点最容易失效的位置。从模型搭建、材料定义到网格划分和载荷设置,全面解析了BGA焊点可靠性分析的全流程,帮助工程师提前预防焊点开裂问题,提升电子封装设计的可靠性。

weixin_30983965的博客 420

DSP28335 ADC模块实战:从寄存器配置到精准数据采集(附代码详解)

本文详细解析DSP28335的ADC模块配置与数据采集实战,涵盖寄存器设置、采样窗口优化、中断处理及代码实现。重点解决ADC精度问题,如采样窗口不足导致数据偏差,提供完整代码示例和调试技巧,助力工程师实现精准数据采集。

kkk56的博客 865

c++ new int的用法

new操作,创建一个对象并为该对象创建内存空间,最后在返回指向该内存的指针。 int *a = new int(10); //创建动态创建整型数。 //括号无参数是 a=0,有参数则a = 参数 int *p = new int[10]; //创建一个有10个元素的动态整型数组,没有赋值,为随机数 int *p = new int10; //创建一个有10个元素的动态整型数组,并都赋值为0 ...

h799710的博客 1万+

Cesium 相机操作

Cesium 提供了三种方式对相机的位置进行摆放。

虎康的博客 2590

C++中new,delete使用注意事项

new 与delete是C++预定的操作符,它们一般需要配套使用。new用于从堆内存申请一块空间,一般动态用于动态申请内存空间,即根据程序需要,申请一定长度的空间,而delete则是将new申请的空间释放。 new 有以下的三种格式申请内存空间 new  数据类型 new 数据类型(初始值) new 数据类型[常量表达式] 如   int  * p1=new int;   int

yhcs1213的专栏 5156

slew dreate,slew threshold与transition计算

​只看rise情况下,from pin取slew threshold10%-90%的区间,slew derate为1,计算得到transition为1.002e-10,to pin的slew threshold 为30%-70%,slew derate 0.5,从波形列表上取相近的值3.75e-10和8.75e-10,计算得到transition为(8.75e-10-3.75e-10)/0.5=1e-9,考虑精度和取值区间问题,基本符合工具计算的值,如下:​。如下示例,在.lib库中有定义以下内容。

m0_61544122的博客 795

解决TexStudio编写LaTeX论文引用文献问题:正文引用处出现[?],参考文献也不显现

当我们利用LaTeX编写论文时,可能会出现引用参考文献时正文引用处出现?号,肯能的原因及解决方案如下: 问题一 忘记在\end{document}前面放\bibliographystyle{样式}和\bibliography{参考文献bib文件名}: \bibliographystyle{plain} \bibliography{sample} 其中, LaTeX 标准选项及其样式共有以下8种: plain,按字母的顺序排列,比较次序为作者、年度和标题. unsrt,样式同plain,只是按照引用的先后

左手の明天的博客 9529

new的用法

1.new关键字(运算符)用法 int main() { int* ip = new int(10); int* pa = new int[10]{};//连续申请10个连续整形空间 //int* pb = new int[n]{};//未初始化 for (int i = 0; i < 10; ++i) { cout << hex << pa[i] << endl; } delete ip; delete[]pa; } 这里new在底

weixin_54131692的博客 2211

【变化检测】变化检测相关数据集+代码+论文合集

光学影像变化检测领域数据集(有label的,无label的)、高光谱影像变化检测领域数据集、3D变化检测领域数据集、传统变化检测算法、深度学习变化检测算法、SAR变化检测算法、高光谱变化检测算法论文及代码等资源。

向上生长的程序媛的博客 2089

常见动态内存分配malloc()/free()、new/delete使用方法及常见错误

1.动态内存分配的几种方式 ①从静态存储区分配内存,内存在编译时已经分配好了,这块内存在整个程序运行期间都存在,比如全局变量 ②从栈上分配内存,函数体结束时,栈内存自动销毁,比如局部变量 ③从堆上开辟内存,比如malloc()/new 2.malloc()和free()的使用方法 malloc()/free()用来动态分配内存,使用方法如下: void *malloc(siz...

跑够一万公里就结婚 2869

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

内存(new delete )

new new 就是程序运行过程中申请空间的一种方式。你可以通过指针去访问这个地址。 delete delete:当你用完这个对象之后,把内存还给内存池的一种方式。 Dynamic Arrays(动态申请数组) int *p =new int ; int *a=new int [10]; 假设student 是个类 student *q =new student (); student *r =new student[10] delete p; a++ ;delete[] a; delete q; del

qq_43186100的博客 1244

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

malloc/free与new/delete的使用要点

malloc/free 的使用要点     函数malloc的原型如下:         void * malloc(size_t size);     用malloc申请一块长度为length的整数类型的内存,程序如下:         int  *p = (int *) malloc(sizeof(int) * length); 我们应当把注意力集中在两个要素上:“类型转换”和“si...

《好好先生》专栏 220

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C++ new和delete 的用法

new与delete是C++预定的操作符,它们一般需要配套使用。new用于从堆内存申请一块空间,一般动态用于动态申请内存空间,即根据程序需要,申请一定长度的空间,而delete则是将new申请的空间释放。1.new的使用使用new运算符时必须已知数据类型,new运算符会向系统堆区申请足够的存储空间,如果申请成功,就返回该内存块的首地址,如果申请不成功,则返回零值。 一般使用格式:      格式1...

wjzjj的博客 559

new后delete出现堆错误

今天在实现多边形的缩放操作的时候,用到了new和delete操作。但是在使用的过程中出现了对错误,搞的头大。后边在查询的过程中了解了一些相关知识: http://www.233.com/ncre2/C/fudao/20090606/080954503.html觉得这个简单明了的说明了可能犯的错误 int *a=new int[10];   ......   delete []a;   -

行者末路的专栏 2097

浅谈 C++ 中的 new/delete 和 new[]/delete[]

在 C++ 中,你也许经常使用 new 和 delete 来动态申请和释放内存,但你可曾想过以下问题呢? new 和 delete 是函数吗?new [] 和 delete [] 又是什么?什么时候用它们?你知道 operator new 和 operator delete 吗?为什么 new [] 出来的数组有时可以用 delete 释放有时又不行?… 如果你对这些问题都有疑问的话,

imxiangzi的专栏 404

条款5:对应的new和delete要采用相同的形式

用delete的时候,也有两件事发生:首先,为将被释放的内存调用一个或多个析构函数,然后,释放内存(通过operator delete 函数,详见条款8和m8)。至少,stringarray指向的100个string对象中的99个不会被正确地摧毁,因为他们的析构函数永远不会被调用。这个规则对喜欢用typedef的人来说也很重要,因为写typedef的程序员必须告诉别人,用new创建了一个typedef定义的类型的对象后,该用什么形式的delete来删除。//一个人的地址,共4行,每行一个string。

qq_41237850的博客 627

new 和 delete

关于new 和 delete,简单来说就是类似于我们在c语言中学过的malloc 和 free函数,所以关于new 和 delete的用法和效果我们可以简单参考一下;

Tysmcl的博客 275

动态内存分配:new 与 delete 的基本用法

动态内存分配是 C++ 灵活管理内存的核心手段,new/delete 运算符实现了堆内存的手动分配与释放,其核心价值在于“运行时动态调整内存大小、控制生命周期”,弥补了静态内存的局限性。本文核心知识点可概括为:静态内存(栈)由编译器自动管理,大小固定;动态内存(堆)由开发者通过 new/delete 手动管理,灵活可控。new 用于分配堆内存(单变量用 new,数组用 new[]),返回内存地址,需用指针接收;

qq_43402143的博客 886

Effective C++之 Item 16: 使用相同形式的 new 和 delete

下面这段代码有什么问题? std::string *stringArray = new std::string[100];...delete stringArray; 每件事看起来都很正常。也为 new 搭配了一个 delete。但是,仍然有某件事情彻底错了。程序的行为是未定义的。直到最后,stringArray 指向的 100 个 string 对象中的 99 个不太可能被完全销毁,因为它...

janeqi1987的专栏 186

Effective C++(编写new和delete时需固守常规)

author: luixiao1223 title: 编写new和delete时需固守常规 new 如果顺利返回指针 如果不顺利, 调用new handler(希望它可以做些什么). 如果没有new handler则返回 =bad_alloc= void* operator new(std::size_t size) throw(std::bad_alloc) { using...

luixiao1220的博客 325

new/delete与new[]/delete[]实现机制

new和delete是C++新引入的单目运算符,它们可以从堆上分配和删除存储块(堆在C++中也叫自由存储).用new运算符(不是函数)时要指明数据类型,以后new就分配一个足以放下指明类型对象的存储,并返回该存储块的首地址作为指向指定类型的指针. 1. new/new[]:完成两件事,先底层调用malloc分了配内存,然后创建一个对象(调用构造函数)。 2. delete/delete[]:也

weizhengbo的博客 3678

mallloc/free和new/delete的区别与联系

首先我们来回顾一下在C语言中有哪些可以用于动态内存开辟的函数: 注意:这三个函数一定要和free()函数配对使用,否则会造成内存泄漏。

半暖的博客 663
上一篇: 在子函数中改变指针变量的值的方法
下一篇: NETBIOS学习
jack237
博客等级 码龄20年 182粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值