问题如下。请问read()函数中的p_numwow鼠标指向宏的内存什么时候释放

【附图】释放内存出现错误,为什么_百度知道
【附图】释放内存出现错误,为什么
jpg" target="_blank" title="点击查看大图" class="ikqb_img_alink"><img class="ikqb_img" src="http?<a href=" & 则程序顺利运行.com/zhidao/wh%3D600%2C800/sign=4fea1d9aa5efce1bea7ec0cc9f61dfe6/0d338744ebf81a4c8e0ab2a5d52aa6。不知道为什么.baidu://h.hiphotos?不是申请内存还要释放内存吗; &nbsp.hiphotos.//根据点数分配内存……delete []/zhidao/wh%3D450%2C600/sign=22ffc40df1deb48ffb3ca9dac52f161f/0d338744ebf81a4c8e0ab2a5d52aa6://h.hiphotos://h.baidu PointCloud *p_/zhidao/pic/item/0d338744ebf81a4c8e0ab2a5d52aa6; & &nbsp,当去掉delete []p_pointdata.jpg" esrc="p_pointdata=new PointCloud[point_num]; //main()函数最后释放内存运行程序出现如下错误
提问者采纳
谢谢。解决方法是在程序最后释放内存,就在使用链表。或者你的错误不在于分配内存后释放掉,但操作系统的确没有释放掉内存,释放两次就会出错,然后后边又使用了该链表,使用malloc或new分配内存,操作系统是不会自动帮你释放的:pHead-&gt,是必须手动释放的;nBlockUse无效,虽然程序运行正常。另外,回Ahao_plus兄。满意请点采纳,或在析构函数里释放内存,你可以试试,释放内存只能操作一次。还有,你还没有分配内存,可以判断原因是,链表都已经不存在了:你已经释放了内存。根据错误信息。你删除delete [] p_pointdata
提问者评价
其他类似问题
为您推荐:
其他2条回答
你是不是在delete []p_
这句之前释放过p_pointdata这块地址啊或者改变过p_pointdata的指向,可能指的已经不是原来分配的内存了在查一下吧
去掉之后不报错是因为,程序运行结束内存就自动释放了,不过还是释放一下比较好。你的问题可能是内存重复释放了吧,仔细查看下代码。
内存的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁动态内存的动态内存分配函数解析_百度知道
动态内存的动态内存分配函数解析
我有更好的答案
//打印分配内存不成功出错信息通常造成内存分配失败的原因如下..、请求内存数量的方式不同....。当内存不再使用时.,包含在库函数 stdlib,改变ptr所指内存区域的大小为size长度.hiphotos..、后者在返回指向内存的指针之前把它初始化为0。有一点需要注意:int *p.。2://b.,函数原型为.,一般在写程序需要判断分配内存是否成功,下面重点来讨论malloc与calloc区别,size_t size).;p=(int *)malloc(sizeof(int)),注意.jpg" target="_blank" title="点击查看大图" class="ikqb_img_alink"><img class="ikqb_img" src="http:1,如果重新分配成功则返回指向被分配内存的指针..,这一点在动态数组内存分配有所体现....对于指针.对于realloc()..,calloc.对于函数calloc用法大致与malloc相同:1,本文将着重阐述动态内存分配函数malloc,在申请内存之后;calloc的参数包括元素的数量和每个元素的字节数:void *callo(size_t num,函数返回新分配内存的首地址.com/zhidao/wh%3D450%2C600/sign=2641d1acaadfedb/63d9f2d70fafbf603c241,返回值以及判断返回是否成功与上面相同:鉴于上述这点,最终都要用free释放空间。<a href="http.baidu..!=NULL).baidu.....,如下程序语句,正确的分配动态内存是十分重要的://b,应将原本的指针ptr=NULL:不论是以上那种方式申请内存..,否则.com/zhidao/wh%3D600%2C800/sign=01e2bae64baaebd9f2d70fafbf603c241.对于malloc,否则返回空指针NULL,作用是在内存的堆区分配一个大小为size的连续空间,函数原型是*void realloc(void *ptr.,可能造成系统崩溃.,如果分配内存成功...com/zhidao/pic/item/63d9f2d70fafbf603c241.,返回NULL.:当分配内存成功之后,size_t size).baidu,不然会造成内存泄漏......;if(p。提示,作用是在内存中分配连续大小为num*size的空间..hiphotos.//需要执行的语句else.、 内存访问越界2.....,应使用free()函数将内存块释放,在终端输入 #.,realloc以及memset的用法.jpg" esrc="http。malloc的参数仅仅是需要分配的内存字节数.。i。iii:man malloc可以知道函数原型是Void *calloc(size_t size) ,否则会形成野指针...h中://b、 所需连续的内存空间不足ii.hiphotos...
你的问题是刚刚学习指针的人都有的问题,需要从地址来认识这个问题,C语言的数据都是需要申请空间来存放的,有静态和动态两种,动态分配的空间大小可以按需要分配,并且可以回收,静态是不可以回收的。
首先,分配动态的空间,指针P和空间的首地址是没有直接的联系的,只是为了手续要使用这个刚刚分配的空间才让P指针指向这个刚刚分配的空间的首地址的话,如果还不理解,你可以反向想想如果你分配的这个空间,而不用P指针指向这个首地址,那么你如何使用这个空间呢? void型是针对地址型的直接分配,为什么不是分配char的空间呢?因为C语言和硬件关系密切, 有写硬件他的地址不是8位存储的,是16位,或者是32位的,那么这个void就忽略了这个硬件地址宽位就分配100个地址就是了,然后,强制转换成char的8位,如...
其他类似问题
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁C++指针内存释放问题_百度知道
C++指针内存释放问题
C++中指针在new和delete操作的时候对内存堆做的如下1、指针的new操作:指针在new之后,会在内存堆中分配一个空间,而指针中存放的是这个空间的地址。如:void main(){ int *p = new int(4); cout && p && cout && *p &&}输出为:0x00431BF04分别为分配的空间地址和地址内存放的值。如果写为:void main(){ int *p = new int(4); cout && *(int *)0x00431BF0 &&}输出为:4程序的意思就是将0x00431BF0内存地址开始的4个byte的块取出转换为int类型输出,即直接读取内存。2、指针的delete操作:指针在delete的时候,会将指针指向的内存区域释放掉,而指针同内存区域的联系并没有被切断,仍然会只想原来指向的内存区域。如:void main(){ int *p = new int(4); cout && p && cout && *p && cout && p && cout && *p &&}程序输出:0x00431BF040x00431BF0-可以看到p前后指向的地址是相同的,而指向地址的内存区域被释放。3、空指针:空指针指向的内存区域为内存的首地址,是不可读写的区域,即空指针不提供操作。删除空指针是安全的(因为它什么也没做)。所以,在写构造函数,赋值操作符,或其他成员函数时,类的每个指针成员要么指向有效的内存,要么就指向空,那在你的析构函数里你就可以只用简单地delete 掉他们,而不用担心他们是不是被new 过。如:void main(){ int *p = NULL; cout && p &&} &#47;&#47;输出0x4、取出内存区域的值在取某内存地址开始的一个区域的值的时候,取出的值取决于用来取值的类型,譬如int为4个byte,char为1个byte,程序如:void main(){ int a[2] = {261,0}; int *pi = char *p = (char*) cout && *(int *)p++ &&
&#47;&#47;取出p地址,转化为取4个byte,并取出内容,之后p向后移动一位 cout && *(int *)p &&
&#47;&#47;取出p地址,转化为取4个byte,并取出内容 cout && (int)*p &&
&#47;&#47;取出1个char类型,并转换为int型 cout && (int)*(char *)pi &&
&#47;&#47;取出pi地址,转换为char类型,取出内容,并转换为int型}程序输出:261115a的存储区域安排为:byte1=5,byte2=1,byte3~byte8 = 0;所以*(int *)p++取的为byte1到byte4; 之后的*(int *)p取的是byte2到byte5;(int)*p取的是byte2;(int)*(char *)pi取的是byte1,之后转换为int型。
其他类似问题
为您推荐:
提问者采纳
时不能保证p的有效性.对p解引用仍然可以访问这片内存.但是p本身还是指向这片内存的;来释放ptr指向的内存==============================================这个要看程序到底是什么意图.这片内存必须是动态内存(堆)上分配的.需要在myClass对象销毁以后就停止对ptr指向内存的读写那可以加delete p,谁分配谁销毁;(最好还好在前面加if(.所以在delete p.delete p.C++的遵循的规则是谁用谁分配!p) )但这不是好的做法.因为p指向的内存不是myClass类分配的.myClass析构函数用到&以后最好再加上一句p = NULL需不需要在类myClass的析构函数里添加&语句的意思是将指针p所指对象的内存交还给系统;delete ptr
提问者评价
谢谢各位,不过只能把分给一个人.这位会兄回答得最全,说到底还是没有理解&谁用谁分配,谁分配谁销毁&.
其他3条回答
不需要delete因为没有通过new来申请空间只有这样的才需要deletefloat *p =这样传入的才需要delete
还有delete是释放指针本身还是指针指向的内存?还是都释放?是释放指针指向的内存。但你这个p,没有申请内存。 所以用不着释放。
谁说这里要delete指针?只有在动态开辟内存的时候才需要释放还有delete当然是释放内存!!!
您可能关注的推广
内存释放的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁关于C语言动态分配内存的问题_百度知道
关于C语言动态分配内存的问题
int main(){ int *q[3]={NULL};#include &lt.h& printf(&quot,%d&}比如 这里q[0]的地址是1那么 q[1]的地址为什么不是5呢.h&gt,%d;#include &stdlib,q[0].h&gt#include &lt,q[1];%d; q[1]=(int *)malloc(1*sizeof(int)),q[2]);;
q[0]=(int *)malloc(1*sizeof(int))
提问者采纳
才能保证内存地址的连续性,如果分配的大小刚好是某个空闲区块大小两次连续的malloc并不保证地址的连续,作为内存管理的优化设计,则优先,是寻找最合理的空间大小去分配,因为空闲内存是不连续的,只有一次malloc分配多个。这个在malloc的官方说明里面有提到
两个问题 一 怎样一次分配多个呢?二 我分开分配了3次 为什么他们之间差的值相等呢? 而且差的值和我后面的算式有关系
q[0]=(int *)malloc(100*sizeof(int));//这样就分配了100个连续的。你纠结这个没有意义,有不是研究win内存管理机制。如果需要连续地址,那么一次分配就可以了。q[0]=(int&*)malloc(3*sizeof(int));q[1]=q[0]+1;q[2]=q[0]+2;这样就是连续分配了3个,访问也没有问题。
提问者评价
其他类似问题
为您推荐:
其他2条回答
malloc并不保证两次分配的内存是连续的,malloc是C语言规定实现的一个函数,但这个函数并没你想的那么简单,不同的编译器可能实现不同。。。
这个函数时在内存管理器的一个接口函数,你分配的整个动态存储区,都是在链表管理之下的。。既然是链表,你申请的内存是一个链表的节点。。。
给你举个例子你要申请一个内存实际上他占用的是
而你得到的指针只是结构体中data的指针,listhead
和size 就在你的数据前面也占内存,起始动态内存全都是要有内存管理器才能实现它的功能的,只是C语言的标准方法有点简单,而且缺点很多,频繁申请释放会造成大量内存碎片,对于使用者为了避免这种情况,通常都是先申请内存池,然后在内存池中用自己的一套规则分配内存,避免产生...
  要实现动态内存的分配,除了利用含指针成员的结构体之外,还需利用C语言提供的几个标准库函数。(使用时应包含头文件“alloc.h”或“malloc.h”或“stdlib.h”)
  1.malloc函数
  函数原型为void *malloc(unsigned int size);在内存的动态存储区中分配一块长度为&size& 字节的连续区域。函数的返回值为该区域的首地址。 “类型说明符”表示把该区域用于何种数据类型。(类型说明符*)表示把返回值强制转换为该类型指针。“size”是一个无符号数。例如: pc=(char *) malloc (100); 表示分配100个字节的内存空间,并强制转换为字符数组类型,函数的返回值为指向该字符数组的指针, 把该指针赋予指针变量pc。若size超出可用空间,则返回空指针值NULL。
  2.calloc 函数
  函数原型为void *calloc...
动态分配内存的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁一道内存分配方面的笔试题_百度知道
一道内存分配方面的笔试题
笔试题,有参考答案,但看不太懂,哪位能否解释得详细一点,谢了四、有关内存的思考题(每小题5分,共20分)
void GetMemory(char *p)
p = (char *)malloc(100);
void Test(void)
char *str = NULL;
GetMemory(str);
strcpy(str, &hello world&);
printf(str);
请问运行Test函数会有什么样的结果?
答:程序崩溃。
因为GetMemory并不能传递动态内存,
Test函数中的 str一直都是 NULL穿场扁渡壮盗憋醛铂互。
strcpy(str, &hello world&);将使程序崩溃。
char *GetMemory(void)
char p[] = &hello world&;
void Test(void)
char *str = NULL;
str = GetMemory();
printf(str);
请问运行Test函数会有什么样的结果?
答:可能是乱码。
因为GetMemory返回的是指向“栈内存”的指针,该指针的地址不是 NULL,但其原现的内容已经被清除,新内容不可知。
void GetMemory2(char **p, int num)
*p = (char *)malloc(num);
void Test(void)
char *str = NULL;
GetMemory(&str, 100);
strcpy(str, &hello&);
printf(str);
请问运行Test函数会有什么样的结果?
(1)能够输出hello
(2)内存泄漏
void Test(void)
char *str = (char *) malloc(100);
strcpy(str, “hello”);
free(str);
if(str != NULL)
strcpy(str, “world”);
printf(str);
请问运行Test函数会有什么样的结果?
答:篡改动态内存区的内容,后果难以预料,非常危险。
因为free(str);之后,str成为野指针,
if(str != NULL)语句不起作用。
提问者采纳
第一个问题:编译器总是要为函数的每个参数制作临时副本,编译器是这样处理的p的副本假设叫tp,那么有tp=p,二者的本质是一个变量,这不过这个变量的值为某块内存的首地址,其实修改了tp的值,使其重新指向一块新内存,但是p为的值为穿场扁渡壮盗憋醛铂互修改,问题来了,不是说,传的是地址吗?但是并没有修改p的值,p依然指向原内存,只是tp指向了新内存.如果tp指向旧内存,且修改了旧内存的数据,这就是传说中的传地址的意义。所以答案是Test函数中的 str一直都是 NULL。 strcpy(str, &hello world&);将使程序崩溃。 第二个问题:这是返回临时指针的问题:编译器会警告的。char p[]=&
&;定义的东西是在栈中的,它有权限的,Test函数运行完,就在栈中消失的,所以返回了是原来的首地址,但是内容未知第四个问题:释放了动态内存,不能在引用,修改数据,建议str=NULL,安全,这是基本问题我感觉是哪本书上的,想补起来了
其他类似问题
为您推荐:
您可能关注的推广
内存分配的相关知识
其他4条回答
呵呵,很经典的笔试题了&&高质量c/c++编程指南&&、&&程序员面试宝典&&里都有答案下面链接里也有
答案说的很明白了啊。你看不懂,估计是不明白函数 传值 与 传地址 的区别。比如:#include &stdio.h&void add1(int x){x++;}void add2(int *x){(*x)++;}main(){int m=0;add1(m);printf(&add1.m=%d&#92;n&,m);add2(&m);printf(&add2.m=%d&#92;n&,m);}这两个函数add1是传值,它不能改变实参m的值,虽然形参x的值在函数内部有改变add2实传地址,函数内部的操作,能改变实参m的值。参数是int类型的情况,如这两个函数所示。如果对参数是指针类型的呢,就是上面的内存分配的各种情况了,好好理解一下吧
面试的题看来都很经典啊。呵呵,看懂了。不过要是我做的话也可会做错。。。
只说几句 指针必须要分配内存。数组在申明的时候就已经分配内存了,数组指针操作特别是字符串操作要小心越位。指针在用完了要手动释放内存,好处就多了 。在没分配内存的时候不能对指针做右值操作。 1)很显然申明变量指针str时候每分配内存,对str的直接操作引用将会出错。 2)堆栈的数据内容是要释放,虽然已经为他分配了地址,但是里面的数据已经不知道了 3)这个是可以的,但是最后要free();他把自己指针的地址来分配内存 4)free后p是指向内存中的随意的地址。不能用会出大问题。
参考资料:
看心情!!!回答
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁}

我要回帖

更多关于 鼠标指向宏 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信