我来我网
https://5come5.cn
 
您尚未 登录  注册 | 菠菜 | 软件站 | 音乐站 | 邮箱1 | 邮箱2 | 风格选择 | 更多 » 
 

« 1 2» Pages: ( 1/2 total )
本页主题: 一个C++里资源管理的小问题 隐藏签名 | 打印 | 加为IE收藏 | 收藏主题 | 上一主题 | 下一主题

zhoubaozhou





性别: 帅哥 状态: 该用户目前不在线
等级: 栋梁之材
发贴: 696
威望: 0
浮云: 1082
在线等级:
注册时间: 2007-03-13
最后登陆: 2023-01-26

5come5帮你背单词 [ layout /'leiaut/ n. 布局,安排,设计 ]


一个C++里资源管理的小问题

刚刚在写一小程序,发现了一个问题,弄了半天,才发现自已错在哪
共享一下。
下面是问题的简化

int main(int argc, char **argv)
{
    char *p = new char[sizeof("hello,world")];
    strcpy(p,"hello,world");
    delete[] p;

    return 0;
}
运行后,会出现错误,不能执行下去。
跟踪了后现在delete 这里出问题了。
开始不思其解
如果去掉strcpy(p,"hello,world");这一句问题就没了
跟踪delete发现确实是里面错了。
后来改了一下
char *p = new char[sizeof("hello,world") + 1];
问题解决了。

思考:
开始一直以为delete这个语句执行时会查new 申请的情况,然后再来delete
但是却发现没有,如 delete字符串只是 delete 到字符串的0x0处。
这样的内存管理应该是存在问题的,可能会造成内在泄露,或都出现我上面的问题。
如果用查表技术,每次new时把其申请的内存地址及申请空间大小存入一个表中
下次delete时只要查一下表就可以不会造成上面的问题了。

当然这样效率可能会低一点。估计是C++将这个问题丢给用户自已去解决了。

刚刚接触C++,以前都是用C的。
看来C++的博大不是一会就能体会得到了。


[ 此贴被zhoubaozhou在2007-08-23 21:36重新编辑 ]
hello,world
顶端 Posted: 2007-08-23 20:56 | [楼 主]
zhoubaozhou





性别: 帅哥 状态: 该用户目前不在线
等级: 栋梁之材
发贴: 696
威望: 0
浮云: 1082
在线等级:
注册时间: 2007-03-13
最后登陆: 2023-01-26

5come5帮你背单词 [ works // n. 工厂 ]


但是如果是这样写
int *k = new int[10];
那么delete如何判别要释放多少内存?

望GG们挂教
不想跟踪delete下去
汇编太烦了
hello,world
顶端 Posted: 2007-08-23 21:01 | [1 楼]
chenyukang



性别: 帅哥 状态: 该用户目前不在线
等级: 人见人爱
发贴: 2275
威望: 0
浮云: 1127
在线等级:
注册时间: 2006-09-24
最后登陆: 2020-08-17

5come5帮你背单词 [ technological /teknə'lod3əikəl/ a. 技术的,工艺的 ]


用g++ 编译运行没问题。。。
"张华考上了北京大学;李萍进了中等技术学校;我在百货公司当售货员:我们都有光明的前途."
          ——《新华字典》1998年修订本p673……
顶端 Posted: 2007-08-23 21:10 | [2 楼]
kangtalc



性别: 帅哥 状态: 该用户目前不在线
头衔: 揍敌客·奇犽
等级: 希望之光
家族: 万人坑恋影部落
发贴: 1723
威望: 5
浮云: 1113
在线等级:
注册时间: 2005-09-21
最后登陆: 2008-06-29

5come5帮你背单词 [ indirect /indi'rekt/ a. 间接的,迂回的 ]


这其实根本就不是DELETE的问题啊
其实问题出在strcpy
你申请的内存空间只有11字节,因为sizeof是不会算\0的
strcpy中的源字符串常量"hello,world"是12个字节(外加一个\0)
你用12个字节的字符串常量复制到只有11个字节的空间中当然会出错
而且这个和CPP没有什么关系吧,你用C应该一样会出错

天上太陽  地上綠樹
我們的身體在大地誕生
我們的靈魂來自於天上
陽光及月光照耀我們的四肢

綠地滋潤我們的身體
將此身交給吹過大地的風
感謝上天賜與奇蹟與窟廬塔土地
願我們的心靈能永保安康

我願能與所有同胞分享喜樂
願能與他們分擔悲傷
請你永遠讚美窟廬塔族的人民
讓我們以紅色的火紅眼為證

顶端 Posted: 2007-08-23 21:11 | [3 楼]
chenyukang



性别: 帅哥 状态: 该用户目前不在线
等级: 人见人爱
发贴: 2275
威望: 0
浮云: 1127
在线等级:
注册时间: 2006-09-24
最后登陆: 2020-08-17

5come5帮你背单词 [ prevention /pri'venən/ n. 预防,防止,阻上,妨碍 ]


[quote]引用第3楼kangtalc于2007-08-23 21:11发表的  :
这其实根本就不是DELETE的问题啊
其实问题出在strcpy
你申请的内存空间只有11字节
strcpy中的源字符串常量"hello,world"是12个字节(外加一个
"张华考上了北京大学;李萍进了中等技术学校;我在百货公司当售货员:我们都有光明的前途."
          ——《新华字典》1998年修订本p673……
顶端 Posted: 2007-08-23 21:16 | [4 楼]
zhoubaozhou





性别: 帅哥 状态: 该用户目前不在线
等级: 栋梁之材
发贴: 696
威望: 0
浮云: 1082
在线等级:
注册时间: 2007-03-13
最后登陆: 2023-01-26

5come5帮你背单词 [ candy /'kændi/ n. (美)糖果 ]


Quote:
引用第3楼kangtalc于2007-08-23 21:11发表的  :
这其实根本就不是DELETE的问题啊
其实问题出在strcpy
你申请的内存空间只有11字节
strcpy中的源字符串常量"hello,world"是12个字节(外加一个)
你用12个字节的字符串常量复制到只有11个字节的空间中当然会出错
.......


不是strcpy错
是new 申请内存里会多申请一个字节来保存一个额外的信息用来delete。
delete通过这个额外的信息就可以判断new申請的內在大小了
像int *k = new int[10];
它會申請11個int
最後一个k[10]就是保存一个码给delete识别的
刚刚试了一下验证了这个想法
将k[10]改成其它值就会出错
改回来这没事了
hello,world
顶端 Posted: 2007-08-23 21:18 | [5 楼]
kangtalc



性别: 帅哥 状态: 该用户目前不在线
头衔: 揍敌客·奇犽
等级: 希望之光
家族: 万人坑恋影部落
发贴: 1723
威望: 5
浮云: 1113
在线等级:
注册时间: 2005-09-21
最后登陆: 2008-06-29

5come5帮你背单词 [ cautious /'ko:əs/ a. 谨慎的,小心的 ]


Quote:
引用第4楼chenyukang于2007-08-23 21:16发表的  :

strcpy会自动增加一个换行?


不是换行啊,是\0要占一个字节的啊,因为要复制的'hello,world"是个字符串常量,加上个\0就是12字节啊
但是new的那个sizeof只算了11个字节啊,没有算上\0,所以要sizeof之后+1为\0留一个字节就不会出错了嘛

天上太陽  地上綠樹
我們的身體在大地誕生
我們的靈魂來自於天上
陽光及月光照耀我們的四肢

綠地滋潤我們的身體
將此身交給吹過大地的風
感謝上天賜與奇蹟與窟廬塔土地
願我們的心靈能永保安康

我願能與所有同胞分享喜樂
願能與他們分擔悲傷
請你永遠讚美窟廬塔族的人民
讓我們以紅色的火紅眼為證

顶端 Posted: 2007-08-23 21:18 | [6 楼]
zhoubaozhou





性别: 帅哥 状态: 该用户目前不在线
等级: 栋梁之材
发贴: 696
威望: 0
浮云: 1082
在线等级:
注册时间: 2007-03-13
最后登陆: 2023-01-26

5come5帮你背单词 [ birth /bə:θ/ n. 出生,诞生,出身,血统,起源,开始,出现 ]


Quote:
引用第4楼chenyukang于2007-08-23 21:16发表的  :

strcpy会自动增加一个 ?


它会复制完0x0才停止,
hello,world
顶端 Posted: 2007-08-23 21:19 | [7 楼]
kangtalc



性别: 帅哥 状态: 该用户目前不在线
头衔: 揍敌客·奇犽
等级: 希望之光
家族: 万人坑恋影部落
发贴: 1723
威望: 5
浮云: 1113
在线等级:
注册时间: 2005-09-21
最后登陆: 2008-06-29

5come5帮你背单词 [ risk /risk/ n. & vt. (冒)风险 ]


Quote:
引用第7楼zhoubaozhou于2007-08-23 21:19发表的  :


它会复制完0x0才停止,

所有就会出错啊,因为你的目的缓冲区的大小都不够

天上太陽  地上綠樹
我們的身體在大地誕生
我們的靈魂來自於天上
陽光及月光照耀我們的四肢

綠地滋潤我們的身體
將此身交給吹過大地的風
感謝上天賜與奇蹟與窟廬塔土地
願我們的心靈能永保安康

我願能與所有同胞分享喜樂
願能與他們分擔悲傷
請你永遠讚美窟廬塔族的人民
讓我們以紅色的火紅眼為證

顶端 Posted: 2007-08-23 21:20 | [8 楼]
kangtalc



性别: 帅哥 状态: 该用户目前不在线
头衔: 揍敌客·奇犽
等级: 希望之光
家族: 万人坑恋影部落
发贴: 1723
威望: 5
浮云: 1113
在线等级:
注册时间: 2005-09-21
最后登陆: 2008-06-29

5come5帮你背单词 [ criticise // v. 批评,评论,非难 ]


Quote:
引用第7楼zhoubaozhou于2007-08-23 21:20发表的  :

它会复制完0x0才停止,


你也说了sizeof+1就对了多嘛

天上太陽  地上綠樹
我們的身體在大地誕生
我們的靈魂來自於天上
陽光及月光照耀我們的四肢

綠地滋潤我們的身體
將此身交給吹過大地的風
感謝上天賜與奇蹟與窟廬塔土地
願我們的心靈能永保安康

我願能與所有同胞分享喜樂
願能與他們分擔悲傷
請你永遠讚美窟廬塔族的人民
讓我們以紅色的火紅眼為證

顶端 Posted: 2007-08-23 21:21 | [9 楼]
zhoubaozhou





性别: 帅哥 状态: 该用户目前不在线
等级: 栋梁之材
发贴: 696
威望: 0
浮云: 1082
在线等级:
注册时间: 2007-03-13
最后登陆: 2023-01-26

5come5帮你背单词 [ combustion /kəm'bΛstən/ n. 燃烧 ]


Quote:
引用第6楼kangtalc于2007-08-23 21:18发表的  :


不是换行啊,是要占一个字节的啊,因为要复制的'hello,world"是个字符串常量,加上个就是12字节啊
但是new的那个sizeof只算了11个字节啊,没有算上,所以要sizeof之后+1为留一个字节就不会出错了嘛

cout<<sizeof("hello,world")<<endl;
是12没错
sizeof会算到0x0
hello,world
顶端 Posted: 2007-08-23 21:22 | [10 楼]
kangtalc



性别: 帅哥 状态: 该用户目前不在线
头衔: 揍敌客·奇犽
等级: 希望之光
家族: 万人坑恋影部落
发贴: 1723
威望: 5
浮云: 1113
在线等级:
注册时间: 2005-09-21
最后登陆: 2008-06-29

5come5帮你背单词 [ twig /twig/ n. 细枝,嫩枝 ]


Quote:
引用第10楼zhoubaozhou于2007-08-23 21:22发表的  :

cout<<sizeof("hello,world")<<endl;
是12没错
sizeof会算到0x0


不会吧。。。。难道是我编译器的问题。。。

天上太陽  地上綠樹
我們的身體在大地誕生
我們的靈魂來自於天上
陽光及月光照耀我們的四肢

綠地滋潤我們的身體
將此身交給吹過大地的風
感謝上天賜與奇蹟與窟廬塔土地
願我們的心靈能永保安康

我願能與所有同胞分享喜樂
願能與他們分擔悲傷
請你永遠讚美窟廬塔族的人民
讓我們以紅色的火紅眼為證

顶端 Posted: 2007-08-23 21:22 | [11 楼]
zhoubaozhou





性别: 帅哥 状态: 该用户目前不在线
等级: 栋梁之材
发贴: 696
威望: 0
浮云: 1082
在线等级:
注册时间: 2007-03-13
最后登陆: 2023-01-26

5come5帮你背单词 [ cash /kæ/ n. 现金,现钱;vt. 兑换成现金 ]


Quote:
引用第11楼kangtalc于2007-08-23 21:22发表的  :


不会吧。。。。


没错,在VC++6.0里是这样的
其它编译器应该一样啊
我估计问题就是
new delete的实现这里了。
delete只能通过在字符串后面再加一个标识符来判断其长度。
strcpy复制过去时,刚好破坏了这个标识符
所以new申请时,要比想要的空间多申请一个单位的内存
hello,world
顶端 Posted: 2007-08-23 21:25 | [12 楼]
chenyukang



性别: 帅哥 状态: 该用户目前不在线
等级: 人见人爱
发贴: 2275
威望: 0
浮云: 1127
在线等级:
注册时间: 2006-09-24
最后登陆: 2020-08-17

5come5帮你背单词 [ pipeline /'paiplain/ n. 管道 ]


Quote:
引用第11楼kangtalc于2007-08-23 21:22发表的  :


不会吧。。。。难道是我编译器的问题。。。

是12。。。。

用g++确实没发现错误啊。。。
都没警告。。
单步调试也没问题。。
"张华考上了北京大学;李萍进了中等技术学校;我在百货公司当售货员:我们都有光明的前途."
          ——《新华字典》1998年修订本p673……
顶端 Posted: 2007-08-23 21:26 | [13 楼]
zhoubaozhou





性别: 帅哥 状态: 该用户目前不在线
等级: 栋梁之材
发贴: 696
威望: 0
浮云: 1082
在线等级:
注册时间: 2007-03-13
最后登陆: 2023-01-26

5come5帮你背单词 [ eager /'i:gə/ a. 热切的,渴望的 ]


Quote:
引用第13楼chenyukang于2007-08-23 21:26发表的  :

是12。。。。

用g++确实没发现错误啊。。。
都没警告。。
.......


那就应该是delete不同编译器的实现不同了
楼上的GG用的是GCC吧,呵呵,微软的东西~~~
有时间分析一下new 还有 delete的实现
hello,world
顶端 Posted: 2007-08-23 21:28 | [14 楼]
« 1 2» Pages: ( 1/2 total )
我来我网·5come5 Forum » 程序员之家

Total 0.015420(s) query 5, Time now is:11-23 07:55, Gzip enabled
Powered by PHPWind v5.3, Localized by 5come5 Tech Team, 黔ICP备16009856号