社区
进程/线程/DLL
帖子详情
与大家讨论c++语言中 指针的申请与撤消问题....欢迎发言
jin_hua
2005-02-28 10:36:49
c语言中.
如何我申请了一段内存..
如:
char *cp ;
cp = new char[20] ;
然后我
将指针后移几个单位.
如:
cp = cp+2 ;
此时, 如果我再用delete cp ;
不知前面的两个单位的内存撤消没有 ,我测试是运行delete cp, 系统出错..如果在delete cp 前
运行cp = cp -2 ;则可以了.
不知delete 是如何处理的..
请高手多发表一个自已的见解啊....
...全文
112
10
打赏
收藏
与大家讨论c++语言中 指针的申请与撤消问题....欢迎发言
c语言中. 如何我申请了一段内存.. 如: char *cp ; cp = new char[20] ; 然后我 将指针后移几个单位. 如: cp = cp+2 ; 此时, 如果我再用delete cp ; 不知前面的两个单位的内存撤消没有 ,我测试是运行delete cp, 系统出错..如果在delete cp 前 运行cp = cp -2 ;则可以了. 不知delete 是如何处理的.. 请高手多发表一个自已的见解啊....
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
10 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
sanhill
2005-03-02
打赏
举报
回复
这个问题这样解决!
char *cp ;
cp = new char[20] ;
需要将指针后移几个单位.
可以这样的 char* p = cp;
然后 p = p+2 ;
取值的话,和使用cp是一样的
最后释放的时候就释放cp就行了。
始终记住一点,释放的地址一定要和开辟的内存地址一致。如果需要移动指针取值,请用中间临时变量。这个规则在哪里都使用。
另外,delete与delete[]对于char,BYTE类型来说,都是一样的,没有区别。
code8238
2005-03-02
打赏
举报
回复
楼上说的有理,但有个疑问,难道每次释放一块内存的时候都要把指针移动回起始位置吗?如果程序执行过程中不知道指针移动到哪里的话,应该怎么释放?
jin_hua
2005-03-02
打赏
举报
回复
多谢楼上指点.....
受益多多..
结贴!
edrftgyh
2005-03-01
打赏
举报
回复
对于内建型别来说,delete [] 和delete实际上是没有什么区别的,所不同的是delete只会调用一次析构函数,而delete []则会对每一个对象调用析构函数。
楼上说的都有道理,但有一点都没有说,当你分配一块内存的时候,实际上系统在这块内存的前面多分配了一个记录内存信息结构大小的空间,用来记录这块内存的大小或是否已被释放等相关信息,当你delete这块内存时,系统实际上会将指针向前便宜以获得这块内存的相关信息,这样就可以正确的释放内存,你将指针向前便宜的话会致使系统获得不正确的内存信息,从而会导致内存释放的错误。
cnwolf
2005-03-01
打赏
举报
回复
楼上的观点我不赞同,堆我不清楚,不好说
栈在使用的时候是从高址到地址的,可是变量的符号是指向地址的吧
就如同我们在函数中声明了int a,b;char c[10];
假设a表示1000h,那么b应该是1000h-4,c应该是1000h-4-A;
c+1,c+2都应该在c这个数组的范围之内,何来越界之说
至于堆,在分配的时候好像除了给用户的数据空间,在前后还有一些系统维护的数据结构
,如果改变指针去删除的话,应该会有问题吧
可以找一些堆溢出的文章看看
yafizyh
2005-03-01
打赏
举报
回复
堆栈的申请是向下分配的。 cp = cp -2 ; cp仍指向分配空间,但cp = cp +2 ;使cp指向了分配空间以外的地址, delete cp ; 会造成系统错误。看看汇编吧,对计算机结构会有比较清楚地了解。
再次强调:堆栈的申请是向下分配的!
code8238
2005-02-28
打赏
举报
回复
释放一段内存应该用
delete[] cp;
flyelf
2005-02-28
打赏
举报
回复
申请了一块内存之后,不能只释放部分内存
abc2003World
2005-02-28
打赏
举报
回复
delete p 与delete []p不同,在MSDN的C++ Language Reference The operator delete Function一文中有提到,使用前者释放数组可能造成泄漏(MSDN:To perform this detection, the global new and delete operators are redefined to count allocation and deallocation of memory)。
同时也解决了第一个问题。
jin_hua
2005-02-28
打赏
举报
回复
回楼上,
申请的内存移动几个单位扣,为何delete cp 会错,难道delete 前一将指
针移到起始点吗?
另:
char *p ;
p = new char[7] ;
则 delete p 与delete []p 的结果是否一样啊.
指高手指点
c++
城市公交查询系统
c++
城市公交查询系统 1.设有一文件对象in_file,若在while循环
中
用in_file>> 每次从文件
中
得到一个字符串直到文件结束, 如果用in_file直接来判断文件是否结束, 则文件末的那个字符串会得到两次。 而用文件in_file.eof()来判断则会得到正确的结果。 2.用delete []释放字符串空间时,老是有
问题
, 其
中
的原因之一是你原来
申请
的空间不够大, 后来往这个空间
中
放了过多的内容以至越界, 这时候会发生运行时的错误。 3.把一个对象作为参数传给另一个对象的成员函数时, 程序不能正常结束,即系统删除对象时有
问题
; 而使用
指针
或者引用传递参数时不仅不会出现
问题
, 而且可以人为的删除对象。 我个人认为这很有可能是值传递的原因, 当把一个对象作为实参传给一个函数时,函数形参拷贝了实参的值, 这时,如果对象有
指针
成员,那么形参的
指针
成员的值和 实参的
指针
成员的值将完全一样, 即它们指向的是同一块内存,所以当函数调用结束的时候, 函数的形参将会被系统
撤消
, 这时,形参调用析构函数,释放用new动态
申请
的内存。在函数的外面, 作为实参的对象的
指针
成员其实已经被
撤消
了,所以当程序结束, 系统
撤消
这个对象时,这个对象又要调用析构函数来释放
指针
成员, 但这时
指针
其实已经指向了非法的空间,导致出错。 bus 文件夹的内容记录的是每条线路的信息,对应于bus 类。 每个文件以线路名称(即车名,忽略前面的k)命名。 每个文件的内容组织如下:(共分为6行,以回车键作为行结束标志) 第一行为“线路名称:#### ”,其
中
####用具体的线路名称代替; 第二行为“上行站点:####”。 第三行为“下行站点:####”。 第四行为“首班车时间:####”。 第五行为“末班车时间:####”。 第六行为“票价:####”。 注:若不分“上行站点”和“下行站点”, 则第二行为“站点名称:####”, 第三行为空行;
c++
指针
初始化
问题
c++
中
的
指针
是一个很经典的用法,但是也是最容易出错的,比如定义了一个
指针
,必须对其进行初始化,不然这个
指针
指向的是一个未知的内存地址,后续对其操作的时候,会报错。这只是其次,最让人头疼的就是
指针
错误
问题
,往往编译的时候可以通过,在程序运行的时候,就会出现异常,如果对程序不是很熟悉,则不是很容易找到
问题
所在,我最近就遇到过很多这样的
问题
,定义了一个结构体
指针
,使用的时候忘记初始化,导致在后边使用的...
详解
C++
中
的
指针
结构体数组以及指向结构体变量的
指针
这篇文章主要介绍了
C++
中
的
指针
结构体数组以及指向结构体变量的
指针
的用法,是
C++
入门学习
中
的基础知识,需要的朋友可以参考下
C++
结构体数组 一个结构体变量
中
可以存放一组数据(如一个学生的学号、姓名、成绩等数据)。如果有10个学生的数据需要参加运算,显然应该用数组,这就是结构体数组。结构体数组与以前介绍过的数值型数组的不同之处在于:每个数组元素都是一个结构体类型的数据,它们都分别包括各个成员项。 定义结构体数组和定义结构体变量的方法相仿,定义结构体数组时只需声明其为数组即可。如: struct Stude
C++
的智能
指针
auto_ptr、unique_ptr源码解析
C++
的智能
指针
auto_ptr、unqiue_ptr源码解析1、前言2、源码准备3、源码解析3.1、auto_ptr解析3.2、unqiue_ptr解3.3、unqiue_ptr的一个偏特化版本4、智能
指针
相关内容的总结5、总结 1、前言 本文仅对
C++
智能
指针
auto_ptr、unqiue_ptr源码进行解析,需要读者有一定的
C++
基础并且对智能
指针
有所了解,本文并不对智能
指针
的使用方法、使用场景、效率等方面进行阐述分析,这些知识需自行查阅相关书籍去了解。 建议大家先看一下这篇文章《
C++
11的智能指
C++
多线程与共享
指针
文章目录
C++
多线程与共享
指针
一、
C++
多线程使用2.1 thread2.2 pthread
C++
多线程与共享
指针
一、
C++
多线程使用 2.1 thread <thread> 该头文件包含有std::thread类与std::this_thread类。以及管理线程的函数。是实现线程的主要文件。 <atomic> 该头文件包含有std::atomic和std::atomic_flag类,是实现原子操作的的主要文件。 <mutex> 包含互斥相关的类与函数。 <f
进程/线程/DLL
15,473
社区成员
49,171
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章