首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 结构指针强制转换?引起内存泄漏? [已结贴,结贴人:aten_xie]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • aten_xie
    • 等级:
    发表于:2007-11-20 17:04:41 楼主
    #include <stdio.h>
    main()
    {
    typedef struct A{
      int a;
      }A1;
    typedef struct B{
      int a;
      int b;
      }B1;

    A1 *ptr = ( A1*)malloc(sizeof(struct A));
    ptr->a = 1;
    printf("%d\n%d\n",ptr->a,ptr);
    (struct B*)ptr->b = 3;//强制将指针转换为B 指针
    (struct B*)ptr->a = 2;
    printf("%d",( B1*)ptr);
    }

    强制将指针ptr从A转为B是不是会发生内存泄漏?
    就像从char 类型指针转为 int 时候,在调用该指针就会发生内存调用越界?
    10  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-11-20 17:08:251楼 得分:0
    会越界
    泄漏不是强制转化引起的。最后你不释放ptr,就会泄漏。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • fetag
    • 等级:
    发表于:2007-11-20 17:10:212楼 得分:1
    这和内存泄露没啥关系吧...

    楼主知道内存泄露这个词到底是怎么回事吗?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-11-20 17:12:343楼 得分:1
    会,
    因为当你强行把b转为a后,再去释放a的指针时,只会释放掉sizeof(a)那么大一块内存,所以就会有sizeof(b) - sizeof(a)
    那么大一部分没有释放掉。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-11-20 17:14:454楼 得分:0
    强制转换类似于指鹿为马。
    本来是一个struct B,你强制转化了非说他是struct A,那它就是struct A。

    你malloc来不free才会内存泄漏
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • fetag
    • 等级:
    发表于:2007-11-20 17:17:075楼 得分:1
    楼上的,我问个问题,malloc()的时候,将返回值存储到一个指针变量里面,对吧。那当你free()的时候,编译器是怎么知道需要free()多大的内存呢?

    如果你说泄露了,那也就是说我申请了100个字节的空间,然后我可以强转,使用了300字节,然后再free()的时候,我就需要free()300字节的空间,对吗?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-11-20 17:17:386楼 得分:1
    to 3楼

    free是不会管这块内存是什么类型的。
    只要是free的malloc返回给他的那块内存就行

    在malloc的时候,堆管理程序会记录这块内存的大小,释放的时候你不需要告诉它这块内存多大
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • fetag
    • 等级:
    发表于:2007-11-20 17:18:127楼 得分:1
    suyouxin ...加塞了,我不是问你啊,嘿嘿

    我是问 xiantongyuan 兄
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • fetag
    • 等级:
    发表于:2007-11-20 17:19:058楼 得分:0
    他说会内存泄露,我就问问他这个问题是怎么解决的,呵呵
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-11-20 17:24:189楼 得分:1
    会,
    因为当你强行把b转为a后,再去释放a的指针时,只会释放掉sizeof(a)那么大一块内存,所以就会有sizeof(b)  -  sizeof(a) 那么大一部分没有释放掉。
    ------------------------------------------------------------------------------------------------
    无语...。  楼住小心!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ttlyfast
    • 等级:
    发表于:2007-11-20 17:38:0710楼 得分:1

    1  没写free()
    2  越界

    3  free()函数并没有长度参数
    4  c中只存在左值右值不存在指针
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-11-20 18:11:3011楼 得分:1
    不会泄漏的,内存分配实现中在分配内存时会记录分配的相关信息
    如下面的结构表示
    //define the information of memory head
    typedef struct AN_ST_MHINFO{
    unsigned int nSize; //alloc memory size
    struct AN_ST_MHINFO *pHRPre; //alloc memory real of prev
    struct AN_ST_MHINFO *pHFNext; //memory free of next
    struct AN_ST_MHINFO *pHFPre; //memory free of prev
    }ANMMHInfo;

    只是在强制转换时会出现内存访问越界错误。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-11-20 18:23:2912楼 得分:1
    强制转换导致访问越界,不过不会发生运行时错误

    还有LZ你写的连编译都通不过把
    ((struct B*)ptr)-> b  ->的优先级比强制转换高,括号是必不可少的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-11-20 21:20:3613楼 得分:1
    强转的话指针本身指向并没有变化
    个人理解是类似于把指针的副本抽象成为指向另一个结构的指针
    但还是感觉(struct B1*)pstr这里理解的有些问题,高手能解释一下吗?谢谢
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-11-20 21:28:3214楼 得分:0
    其实一个指针的类型只在编译期间算偏移,算大小,做检查有用
    它不对数据做任何改变,只是告诉编译器怎样解释一块内存
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-11-29 17:32:4015楼 得分:0
    内存泄露是指,内存使用后没有释放。这段代码只有申请内存,不见释放,肯定会导致泄露了。
    另外类型转换会导致内存越界。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-11-29 17:55:5016楼 得分:0
    free了就不会有memory leak, 与指针类型转换无关。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-11-29 18:36:1317楼 得分:0
    我想问一下,怎么测试发生了内存泄露啊!我总不能总是靠眼睛看吧!假如有很大的代码量我怎么知道我的程序里边是否发生了内存泄漏!望高手告知一下,谢谢!
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved