C++不同函数内delete的问题

在函数point中用new分配了一个动态字符数组,返回指向这个数组的指针,然后在main函数中赋给指针name,那怎么样在使用完name后用delete删除这个动态空间呢?图片图片

c++

10个回答

首先这种写法也是没有问题的,系统自己的API都有这种类似的调用,比如编码转换函数MultiByteToWideChar(), 就需要在外部释放空间。
对于数组的释放应该选用delete[],希望对你有帮助。

qq_35640156
qq_35640156 感谢~
接近 3 年之前 回复

尼玛这图片是怎么上去的,请大家忽视第一张图。

先说一下delete。delete关键字操作之后,只是告诉内核回收这片内存。但是new出来的堆区指针存在,还是指向这片内存区。但是这片内存区有可能在程序运行期间,被其他数据占用,那么这时这块数据区相对于原来来说,已经是垃圾数据。
这个问题可以直接在主函数内完成。但是一般不会这么做,会有专门的回收机制。要么就是运行结束,会自动释放

u013456079
tiger_future 回复qq_35640156: 可以
接近 3 年之前 回复
qq_35640156
qq_35640156 就是说不用在主函数中使用delete释放内存是吗?
接近 3 年之前 回复

函数的传入就传入引用,然后main函数里面去delete

char* name = point();//干嘛还在point()之前加char* 返回值 已经是char* 不需要强制类型转换
delete name;//delete[] name; 二者都可以。用delete name比较合适

qq_35640156
qq_35640156 是在主函数里新声明一个指针name,然后初始化为函数point的返回值
接近 3 年之前 回复

一般来说new对应delete,new []对应delte [],因为代码中使用了char* ps = new char[10]; 所以用delete[] name会更合适一点,但由于基本类型数组两个可以混用,不过还是不推荐这样用,因为类对象数组只能用delete对应new,delte[]对应new[],还是养成良好的编程习惯比较好

应该用delete[],更好的做法是再提供一个释放函数来对应。

对于单变量分配内存时用new、删除内存时delete,对于数组用new[ ]和delete[ ]

new ... delete
new ..[] delete []对应的

  1. main() 括号没有写;
  2. 没有使用new申请, 自己定义的name指针是系统分配的,在栈上,不需要释放;
  3. new 与 delete 成对出现;
  4. mian() 和 point() 函数里的 指针不是同一个,函数内部的变化不能直接返回,应该使用**二级指针;
u011491972
icesongqiang 回复qq_35640156: 变量的生存区域限制,你使用一级指针是传不回去的
接近 3 年之前 回复
qq_35640156
qq_35640156 不能直接返回一个指针吗?
接近 3 年之前 回复
u011491972
icesongqiang main() 和 point() 函数里的 指针不是同一个,函数内部的变化不能直接返回,应该使用**二级指针;
接近 3 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
C++不同函数内delete的问题
在函数point中用new分配了一个动态字符数组,返回指向这个数组的指针,然后在main函数中赋给指针name,那怎么样在使用完name后用delete删除这个动态空间呢?![图片](https://img-ask.csdn.net/upload/201609/25/1474789103_458475.jpg)![图片](https://img-ask.csdn.net/upload/201609/25/1474788981_850543.jpg)
在函数内new的,应该在哪个地方delete
我在一个按钮内,new出了一个对话框,这个delete dlg应该放在什么地方呢?rnvoid CPrjDlg::OnBtn1() rnrn // TODO: Add your control notification handler code herern DlgTest* dlg = new DlgTest;rn dlg->Create(IDD_DLG_TEST,this);rn dlg->ShowWindow(TRUE); rnrn
delete 与delete[]有什么不同?
delete 与delete[]有什么不同?分不清楚什么时候该用哪个了。rnchar *str; rnstr = new char[30];rn的话应该用哪个? rn
有关delete函数的问题?
设计了以下代码:rnvarrninput,output,str:string;rnbeginrninput:=copy(str,1,6);rndelete(str,1,6);rnoutput:=copy(str,1,6);rnrnstr 变量的值是从文本文件(没设成自动换行)load来的,其内容举例如下:rn123456rn789111rn122496rn共有n行,每行的字节数都相同(这里举例为6个)。rn我想问执行delete(str,1,6);后是否会得到一行空行?这样output的值为空值?如果是用什么办法可以将第一行的空行去掉,让output能取得第2的值(就是让output=‘789111’)。rn因为是有n行,n为不知数,所以不能用output:=(str,7,6);这种方法取得第2行,以及第3,4.....行。rn请高手告诉我解决的办法
cpp——与c比较之不同——函数 static const
c++与c比较之不同(二)
c delete 问题
[code=C/C++]rnvoid main()rnrn char * lp;rn lp = new CHAR[10];rn strcpy(lp,"123456789");rn delete lp;rn lp++;rn delete lp;rnrnrn[/code]rn为什么会出错?
成员函数内delete this
delete this 以下引用自:http://www.cppblog.com/lovedday/archive/2008/06/03/52060.html 成员函数调用delete this合法吗? 只要你小心,一个对象请求自杀(delete this),是可以的。 以下是我对“小心”的定义: 你必须100%的确定,this对象是用 new分配的(不是用new[],...
C语言 函数for循环内递归的问题
void rec(int i,int j,int edge)rnrn if(i!=0)rn rn for(;j
C语言malloc在函数内使用的问题
假如我用malloc在一个函数内申请了一块堆,然后返回这个块的地址。rn当这个函数结束的时候,这块堆空间会不会在程序运行的时候被再次使用?rnrnmalloc是给这块空间作了正在使用的标记rn可是函数结束后会释放函数执行过程中产生的垃圾rn虽然没有free,那么这块空间是否依然被标记正在使用?rnrn例如rn[code=C/C++]#includern#includern#includernchar * create()rnrn char *tmp;rn tmp=(char *)malloc(100);rn return tmp;rnrnint main()rnrn char *p;rn p=create();rn strcpy(p,"hello");rn printf("%s\n",p);rn free(p);rn return 0;rn[/code]
delete函数
Drools规则引擎是一种嵌套在应用程序中的组件,它实现了将业务规则从应用程序代码中分离出来。本次课程的主要内容分为以下几个方面:rn1.规则引擎、 Drools规则引擎简介rn2.Drools规则引擎各类基础知识点讲解,如kmodule、no-loop、salience等rn3.各类基础函数以及决策表,动态加载规则rn4.实战式教学以及课程总结
DELETE函数
_RecordsetPtr只能指向的delete函数怎么用的,举个例子,还有它的参数是怎么定义,初始化的,,跟这个函数有关联的前前后后,代码贴的详细点,,,感激不尽,,,
不同含义的new delete
new\delete 1、new oprator要完成的两部分 <1>分配内存,有oprator new 来做 <2> 调用构造函数初始化内存中的对象 2、oprator new 作用;返回未处理的指针和未初始化的内存 原型 :void * operator new(size_t size); 重载全局的oprator new <1> void* operato...
函数return和delete冲突的问题
一个函数需要返回一个指针,还需要删除一个动态分配的内存。rnrnreturn之后函数就会停止执行,delete就无法执行;rndelete之后,return回去的变量也就没有意义了。rnrn纠结呢,不知道怎么才能让动态分配的数据被删除,还能把那数据返回呢?
dll内new和delete的问题求助
DLL文件中有这么个函数:rnrnbool FetchFirstDevCnts(/*[out]*/char *firstDev,/*[out]*/ unsigned int *Count)rnrn printf("进入调用模块!\n\n");rn unsigned int i = 0;rn pcap_if_t *firstdev = NULL;rn pcap_if_t *d = NULL;rn char errbuf[256];rn rn firstdev = new pcap_if_t();rn d = new pcap_if_t();rn if(NULL == firstdev)rn rn // strcpy_s(PEle,sizeof(errbuf),"Initilize point failure!");rn return false;rn rn printf("开始find all devices!\n\n");rn if(pcap_findalldevs(&firstdev,errbuf)<0)rn rn rn assert(memcpy(firstDev,errbuf,sizeof(errbuf)));rn fprintf(stderr,"Error in pcap_findalldevs: %s\n",errbuf);rn return false;rn rnrn rn assert(memcpy(firstDev,firstdev,sizeof(firstdev)));rn for(d=firstdev;d;i++)rn rn printf("开始循环查找设备!\n\n");rn if(NULL == d)rn rn break;rn rn d=d->next;rn rn printf("结束循环查找设备!\n\n");rn Count = &i;rn printf("开始释放设备!\n\n");rn pcap_freealldevs(firstdev);rn if(NULL != firstdev)rn rn printf("正在释放设备!\n\n");rn delete firstdev;rn firstdev = NULL;rn rn printf("结束释放设备!\n\n");rn return true;rnrnrnrn调这个DLL中的这个函数时,报assertion failedrnrn调试了下,出错是在 delete firstdev语句;rnrn求教这个错误背后是什么原因?rn我该怎么解决?rnrn谢谢大家
c++中的函数 和 c 函数的不同
c++中无参的函数参数列表要严格匹配,void型的参数依然可用 int test(void); c++不再支持c的隐式声明 函数调用之前要么提前声明 要么定义。c函数中 函数的返回值类型 默认是int,但c++函数中int不能省略。 (函数必须指定返回值类型) 函数体中没有返回值 编译器表现正常。
C++/CLI 内 delete 释放内存的问题.
[code=C/C++]rnusing namespace System;rnrnpublic ref struct APPrnrn String^ TheString;rn APP(String^ inString)rn rn TheString = inString;rn rn;rnrnpublic ref class BPPrnrnpublic: property APP^ TheAPP;rnpublic:rn BPP(APP^ inAPP)rn rn TheAPP = inAPP;rn rn;rnrnpublic ref class CPPrnrnpublic: property APP^ TheAPP;rnpublic:rn CPP(APP^ inAPP)rn rn TheAPP = inAPP;rn rn;rnrnint main()rnrn APP^ app = gcnew APP("Weird.");rn CPP^ cpp = gcnew CPP(app);rn delete cpp;rn Console::WriteLine(cpp->TheAPP->TheString);rn Console::Read();rn return 0;rnrn[/code]rn这代码编译通过, 运行起来输出为: Weird.rn很费解, 求解释.
不同函数动态调用问题
针对不同的函数(返回值,参数都不同)如何进行动态调用?rn如果是统一模式的函数,用函数指针数组可以解决。但是,每个函数都不一样,应该怎么建立相应的结构呢?rnstruct func_tablern char *func_name;rn FUNC_TYPE func_ptr;rn;rn何如定义这个FUNC_TYPE类型的函数指针?
c++函数内new建立的指针如何delete
class movennmove move::add(const move & m)constnn move *p = new move;n p->x =x+ m.x;n p->y =y+ m.y;n return *p;nnn move & a2 = move1.add(move2);n a2.showmove();n delete &a2;n n 如上,运行报错,异常。。
使用delete和delete[]的问题
class A;rn...........rnrnA* a = new A;rn或者rnA* a = new A[10];rnrn要释放删除的时候我不知道前面用的是不是数组,应该怎么删除呢rn
关于delete和delete[]的问题
我在faq上看到这段话:rnrn[16.12] 当delete一个内建类型 (char, int, 等)的数组时,能去掉 [] 吗?rn不行!rnrn有时程序员会认为在delete[] p 中存在[] 仅仅是为了编译器为数组中的每个元素调用适当的析构函数。由于这个原因,他们认为一些内建类型的数组,如 char或int可以不需要[]。举例来说,他们认为以下是合法的代码:rnrn rnrn void userCode(int n)rn rn char* p = new char[n];rn // ...rn delete p; // <— 错!应该是 delete[] p !rn rn但以上代码是错误的,并且会导致一个运行时的灾难。更详细地来说,delete p调用的是operator delete(void*),而delete[] p调用的是operator delete[](void*)。虽然后者的默认行为是调用前者,但将后者用不同的行为取代是被允许的(这种情况下通常也会将相应的operator new[](size_t)中的 new 取代)。如果被取代的delete[] 代码与delete 代码不兼容,并且调用错误的那个(例如,你写了delete p而不是delete[] p),在运行时可能完蛋。 rnrn---------------------rn我想问的是,上面代码在VC上运行是正确的,内存能够正确地被释放。这是怎么回事呢?rn
关于delete和delete[]的问题!
[code=C/C++]rn #include rn rn class CTest2 rn rn public: rn int m_iTest2; rn CTest2() rn ~CTest2() rn rn ; rn rn class CTest rn rn public: rn int m_iName; rn int m_iCount; rn CTest() rn ~CTest() rn rn ; rn rn int main() rn rn rn CTest* t =(CTest*) new CTest2[2]; rn delete [] t; // ? why not use "delete t", and when use "delete t", rn // runtime error occurs rn rn rn CTest* t =(CTest*) new int[2]; rn delete t; // ? why not use "delete [] t", and when use "delete [] t", rn // runtime error occurs rn rn return 0; rn rn [/code]
delete和delete []老问题
我在VC 6.0上试了下,自己定义了一个数据结构。rnrnstruct PITIMErnrn time_t time;rn short ms;rnrnrnrn然后在500ms的定时器中周期申请内存和释放,rnrnPITIME * pBufer=new PITIME[10000];rnrndelete pBufer; rnrn居然也没有内存泄露,是否编译器给作了优化了吗?(你没写[],编译的时候自动给你加上了呢)rn未找到证据。有谁给个说法。rnrnrn
【C学习笔记】C语言实现Delphi的Pos()、Copy()、Delete()函数
本代码由博主黄仁来原创,转载需注明出处:https://blog.csdn.net/weixin_43334745 2018-10-05  最近在学习C,深感C指针的强大(和危险),掌握得好,则对内存控制如鱼得水;掌握不好,轻则得到乱码,程序异常退出,重则系统蓝屏死机。都说指针是C的灵魂,一点也不为过。 今天拿指针来小试,写三个字符串处理函数,即Delphi中的Pos()、Copy()、De...
delete & delete[]的问题
int _tmain(int argc, _TCHAR* argv[])rnrn for(int i=0;i<10000;i++)rn rn int *p3=new int[10000];rnrn rn return 0;rnrn如果程序这样写的话,我在任务管理器里面观看,内存会一点一点的增加,而且程序要运行很长时间才结束rnrnint _tmain(int argc, _TCHAR* argv[])rnrn for(int i=0;i<10000;i++)rn rn int *p3=new int[10000];rn delete []p3;rnrn rn return 0;rnrn如果这样写的话,经观察内存消耗很小,而且程序运行的很快。rnrnint _tmain(int argc, _TCHAR* argv[])rnrn for(int i=0;i<10000;i++)rn rn int *p3=new int[10000];rn delete p3; //注意这里和第二个例子有区别rnrn rn return 0;rnrn如果程序写成这样的话,运行的效果和第二个一样。rn这我就有一些不理解了,书上说应该写成delete []p3的形式,如果写成delete p3那么只能把p3所指向的一个单元释放了,其余的单元没有释放,也就是还有绝大部分的内存是不释放的,但是为什么程序中内存使用量几乎不增加,几乎和delete []p3一个效果?而delete []p3是告诉编译器,不仅要释放p3所指向的一个单元,而且要把连续的10000个单元也释放了。rn但是根据我刚才的试验,为什么delete []p3和delete p3产生一样的效果?rn我是在winxp & vs2003.net 下做的试验。rnrnrn
truncate / delete / drop 同与不同
truncaterndeleterndrop同与不同rn能否说一下它们删除一些东西,比如表结构之类的。要简单点,刚学数据库的。说的越简单越给分!o(∩_∩)o...
关于new delete函数
楼主是小白[img=https://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/001/face/49.gif][/img]想知道一下代码哪里有问题rn#include"stdio.h"rn#include"string.h"rnrnint main(int argc, char* argv[])rn char *a=new char;rn gets(a);rn printf("%s\n",a);rn delete[](a);rnrn return 0;rnrn错误对话框截屏:[img=https://img-bbs.csdn.net/upload/201312/02/1385978430_566499.jpg][/img]rn如果不写结尾的delete,执行就是成功的[img=https://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/001/face/15.gif][/img]。rn
一个delete char 的函数
#includernvoid * delch(char *p,char ch) rnrn int i=0;rn char *dest=(char*)malloc(sizeof(char)*strlen(p));rn while (*p!='\0')rn rn if (*p==ch)rn printf("cccc");rn p++;rn rn elsern *dest++=*p++;rn rn rn strcpy(p,dest); // ********rn free(p); //************rn rn rn rnint main()rnrn char *p="12345";rn delch(p,'3');rn while (*p!='\0')rn printf("%c",*p++);rnrn~ 有段错误 !
简单链表类的DELETE函数
这是头文件:n#include nusing namespace std;ntemplatenclass KNOTEnnpublic:n A data;n KNOTE * next;n KNOTE(A data,KNOTE * next);n virtual ~KNOTE();n;ntemplatenKNOTE::KNOTE(A data,KNOTE * next)nn this->data=data;n this->next=next;nntemplatenKNOTE::~KNOTE()nn delete next;nntemplatenclass LInnprivate:n KNOTE * headp;npublic:n LI();n ~LI();n KNOTE * GETP(int pos);n int length();n bool CLEAR();n bool SETV(int pos,A v);n bool GETV(int pos,A & v);n bool INSERT(int pos,A v);n bool DELETE(int pos,A & v);n;ntemplatenLI::LI()nn headp=new KNOTE(0,NULL);n ntemplatenLI::~LI()nn A temp;n while(length()>0)n n DELETE(1,temp);n nntemplatenint LI::length()nn int len=0;n KNOTE * tempp=headp->next;n while(tempp!=NULL)n n len++;n tempp=tempp->next;n n return len;nntemplatenKNOTE * LI::GETP(int pos)nn KNOTE * tempp=headp;n if(pos<0||pos>length())n return NULL;n elsen n int cur=0;n while(cur!=pos)n n tempp=tempp->next;n cur++;n n return tempp;n nntemplatenbool LI::SETV(int pos,A v)nn KNOTE * tempp;n if(pos<1||pos>length())n return false;n elsen n tempp=GETP(pos);n tempp->data=v;n return true;n nntemplatenbool LI::GETV(int pos, A & v)nn KNOTE * tempp;n if(pos<1||pos>length())n return false;n elsen n tempp=GETP(pos);n v=tempp->data;n return true;n nntemplatenbool LI::CLEAR()nn KNOTE * tempp1=headp->next;n KNOTE * tempp2;n while(tempp1!=NULL)n n tempp2=tempp1->next;n delete temp1;n temp1=temp2;n nntemplatenbool LI::INSERT(int pos,A v)nn if(pos<1||pos>length()+1)n return false;n elsen n KNOTE * pre_p;n KNOTE * new_p;n pre_p=GETP(pos-1);n new_p=new KNOTE(v,pre_p->next);n pre_p->next=new_p;n return true;n nntemplatenbool LI::DELETE(int pos,A &v)nn if(pos<1||pos>length())n return false ;n elsen n KNOTE * pre_p;n KNOTE * temp_p;n pre_p=GETP(pos-1);n //KNOTE * pre_p1=headp->next;n temp_p=pre_p->next;n pre_p->next=temp_p->next;n v=temp_p->data;n //KNOTE * pre_p2=headp->next;n delete temp_p;n //KNOTE * pre_p3=headp->next;n return true;n nnnnnn n以下是主函数n#include "head.h"nint main()nn LI aa;n int v;n for(int i=1;i<=10;i++)n n aa.INSERT(1,i+2);n n for(int i=1;i<=10;i++)n n aa.GETV(i,v);n cout<next;已经对头指针指针域改变,但deletetemp_p后还是会报错?求大神回答
new/delete 和globalalloc/globalfree的不同??
如题
delete 函数释放出错
代码如下,出错的地方我加注释rn#include "stdafx.h"rnchar *mystringget(char *p,int i)rnchar *pp;rnpp=new char [100];rnstrcpy(pp,p);rnint k=strlen(pp);rnpp=(pp+k-i);rnif (i
delete()函数的疑问
一般new跟delete是配对使用的。查了相关资料,得到的结果是rnnew + 类型 配对 delete + 指针名;rnnew + 类型[n] 配对 delete[] + 指针名;rn即rnint *p = new int;//释放时用 delete p,p=NULL;rnint *p = new int[10];//释放时用 delete[] p,p=NULL;rn上面的我已经弄明白。rnrn现在我不明白的是,在我的代码中,我是这样用的rnrn//申请内存rnint *p = new int[10000];//释放时用 delete(p) ,p=NULL;rnrn...//对p进行操作rnrn//操作完成后释放rndelete(p);//原来不知道正确的做法要用delete[] p;rnp=NULL;rnrn程序运行时这段代码不断被调用,通过任务管理器查看,内存能够被释放,即内存的使用很稳定。rn现在想知道delete(p)与delete[] p;到底有什么区别?rn使用delete(p)会不会存在什么风险?rn我猜想delete()应该是c函数,而delete则是c++关键字,但是查找MSDN与在网上都找不到delete()的介绍。
_RecordsetPtr Delete函数
ADODB::_RecordsetPtr pRecordSet = NULL;rn....rnpRecordSet->Delete(adAffectCurrent);rnpRecordSet->Update();rnrn系统提示:error C2065: 'adAffectCurrent' : undeclared identifierrn
Delete函数格式?
-
函数外delete
#include "stdafx.h" #include &lt;windows.h&gt; #include&lt;iostream&gt; namespace newSpace { char *str = new char[20]; void deleteStr() // 其实没有什么用 { delete[] str; } } char...
数据删除delete函数
不管把是数据整理到模型训练你的模型,还是做漂亮的各种可视化图都需要整理好数据,要美地传数据,numpy是python数据处理的核心基础,几乎没有一个python数据分析工具不用numpy的。比如pandas, sickit,甚至各种深度学习框架比如tensorflow都离不开numpy。n咨询讨论QQ群:633455803 咨询微信:eConnection
C语言函数内static关键字详解
static关键字有两类使用:函数外使用和和函数内使用,其中函数外使用主要用来限制被修饰的函数或变量作用域为本文件,没什么可多说的,下面重点说一下static关键字在函数体内的用法.
c 函数内回传动态申请的空间
int a(char *buf)rn buf = (char*)malloc(10);rn buf[0]='1';rnrnvoid main()rn char *buf=0;rn a(buf);rn printf("%s",buf);//返回NULLrnrn为什么??
C函数访问C++内的成员
大家好,请教一个问题:rnrn大概意思如下,我想在C函数search中访问test类的mValue成员,请问如何办?谢谢rnrn[code=c]rnvoid search()rnrn if(mValue > 0)rnrn // do somethingrnrnrnclass testrnrnpublic:rn int mValue;rnrn[/code]
关于函数内声明函数问题?
代码:rn#include rn#include rnchar *timestr()rnrn time_t time();rn char *ctime();rn long t;rn static char buf[32];rnrn (void)time(&t);rn (void)strcpy(buf, ctime(&t));rn buf[strlen(buf) - 1] = NULL;rn return buf;rnrnint main()rnrn printf( "%s\n",timestr());rn return 0;rnrn请问timestr函数中前两行time_t time();和char* ctime();启什么作用?看了半天没看明白。(这是别人的代码)。rn我的系统Unix 编译器用的是cc。
函数内变量释放的问题?
小弟在写服务器的时候,有个函数内部有死循环不断在声明变量(处理连接的部分),显然这个函数不会退出,书上说函数内变量只有在函数退出才释放,但我看好几本介绍网络的书中都没有对此做处理,不知道大家对此怎么处理的?
相关热词 c++和c#哪个就业率高 c# 批量动态创建控件 c# 模块和程序集的区别 c# gmap 截图 c# 验证码图片生成类 c# 再次尝试 连接失败 c#开发编写规范 c# 压缩图片好麻烦 c#计算数组中的平均值 c#获取路由参数