免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: kiffa
打印 上一主题 下一主题

[C++] 关于new和delete,帮忙测试一下下面的代码。 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2008-10-20 11:30 |只看该作者
原帖由 disheng727 于 2008-10-20 11:28 发表

好像有点不对吧,这种情况下只有当该类对象的大小刚好为一个指针的大小才成立,如若把A的成员int i改为char ch,就有点问题,觉得应该是:int *ip = (int*)(p) - 1;

拜托 p只是指针。。。 其sizeof在一个特定平台上是一个特定值
怎么和对象大小扯上关系了。。

论坛徽章:
0
12 [报告]
发表于 2008-10-20 11:34 |只看该作者
原帖由 blizzard213 于 2008-10-20 11:29 发表

请问下 这个应该只是一种通用的实现方式吧 标准不太可能规定这个


不知道,没看过C++标准,偶只是在VS2008下观察得来的,gcc也是一样

论坛徽章:
0
13 [报告]
发表于 2008-10-20 11:38 |只看该作者
拜托 p只是指针。。。 其sizeof在一个特定平台上是一个特定值
怎么和对象大小扯上关系了。。

class A
{
    public:
             //int i;
             char ch;
             ~A(){cout << "haha" << endl;}
};


int main()
{
    A *p = new A[3];
   
    int *ip = (int*)(p - 1);
    *ip = 5;
   
    delete []p;
}

   
自己去试一下就知道输出结果如何。

论坛徽章:
0
14 [报告]
发表于 2008-10-20 11:50 |只看该作者
原帖由 j1111011 于 2008-10-20 11:44 发表
A *p = new A[3];
   
    int *ip = (int*)(p - 1);
    *ip = 8;
   p[6] = 12;
   A bobo        =        p[3];
   bobo        =        p[4];
   bobo = p[5];
   bobo        =        p[6];
   bobo        =        p[7];
    delete []p;

我又尝试 ...

高度中没报什么错?
什么意思

论坛徽章:
0
15 [报告]
发表于 2008-10-20 15:34 |只看该作者
在《inside c++ object model》里面就说到过这个东西
不同的编译器的实现会不同
但是现在貌似统一的挺不错了,一般的会在一个new或者malloc分配的空间的前面和后面放一段空间的cookies
前面是分配的个数符号
后面是分配的终止符号
符号会因为不同的类的分配而不同!

论坛徽章:
0
16 [报告]
发表于 2008-10-20 18:07 |只看该作者
一个复杂一点的例子:

// A定义和第一个帖子定义一样

A *p = new A;
cout << (long)p << endl;
delete p;
A *p2 = new A;
cout << (long)p2 << endl;


你会发现p 和 p2 的值是一样的。

然后:

A *p = new A;
cout << (long)p << endl;
delete []p;  // 注意。

A *p2 = new A;
cout << (long)p2 << endl;

你会发现p 和 p2不同,其根本原因就是delete []p 这一句并没有释放内存。

new A的时候,p - 1中存放内存大小相关的数据,p - 2中为0,delete A 时访问p - 1得到内存大小,释放。

而delete []A时,把p - 1中的值作为分配对象的个数来调用析构函数,然后把p - 2的值作为内存大小释放,而这里的p - 2 其值为0,所以delete语句并没有释放内存。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
17 [报告]
发表于 2008-10-20 18:15 |只看该作者
原帖由 cj_gameboy 于 2008-10-20 08:19 发表
我是新手,请教下,C++可以在unix上编译吗,原以为C++只能在win平台上编译,用vs编译,是不是我搞错了,也可以用gcc编译啊


C/C++都可以在LINUX和WINDOWS编译和运行的。

论坛徽章:
0
18 [报告]
发表于 2008-10-20 18:15 |只看该作者
同样:

new A[3];
delete A;

会把分配对象的个数当成内存大小的相关信息来释放,只要A不小于一个字节,那么就会导致内存释放不完全,造成泄露。


因此这不仅仅是析构函数调用次数不够的问题,还可能造成内存泄露,不过限定于编译器的特定实现。

[ 本帖最后由 kiffa 于 2008-10-20 18:18 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP