免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4267 | 回复: 17
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-20 02:33 |只看该作者 |倒序浏览
我手头没有win的编译器,所以希望有vs、vc的能帮我测试一下下面的代码,看看输出结果是什么。用gcc的也顺便测试一下,我看看各个版本是否有差别。

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


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



我这里的测试结果是输出 5 个 "haha"。

论坛徽章:
0
2 [报告]
发表于 2008-10-20 02:52 |只看该作者
原帖由 kiffa 于 2008-10-20 02:33 发表
我手头没有win的编译器,所以希望有vs、vc的能帮我测试一下下面的代码,看看输出结果是什么。用gcc的也顺便测试一下,我看看各个版本是否有差别。

class A
{
    public:
             int i;
          ...

vc2005
5个 haha

可以解释一下吗?
感觉是p前一个int为记录数组大小的cookie。。。

[ 本帖最后由 blizzard213 于 2008-10-20 02:56 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2008-10-20 08:19 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
4 [报告]
发表于 2008-10-20 08:21 |只看该作者
vs2008也是5个haha。

ls说法应该是正确的。

论坛徽章:
0
5 [报告]
发表于 2008-10-20 09:21 |只看该作者
厉害,原来P-1的存储位置为该动态存储元素的个数。将其改成5,就调用了5次析构,如果改成7,也就将调用7次析构。

论坛徽章:
0
6 [报告]
发表于 2008-10-20 09:28 |只看该作者
原帖由 disheng727 于 2008-10-20 09:21 发表
厉害,原来P-1的存储位置为该动态存储元素的个数。将其改成5,就调用了5次析构,如果改成7,也就将调用7次析构。

真有此事?我去测试一下。。。。

论坛徽章:
0
7 [报告]
发表于 2008-10-20 10:33 |只看该作者
所有编译器都这样吗?

论坛徽章:
0
8 [报告]
发表于 2008-10-20 11:14 |只看该作者
用 A*p = new A[3];  来建个A object 数组的模型的这样的:

                ----------
                        |          |      A[2]
                        ----------
                        |          |       A[1]
                        ----------
                        |          |       A[0]
                        ----------       <--------- p
                        |    3    |      size ( new 返回)
                        ----------      


int *ip = (int*)(p - 1); 将 size 改成 5

论坛徽章:
0
9 [报告]
发表于 2008-10-20 11:28 |只看该作者
int *ip = (int*)(p - 1);

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

论坛徽章:
0
10 [报告]
发表于 2008-10-20 11:29 |只看该作者
原帖由 mik 于 2008-10-20 11:14 发表
用 A*p = new A[3];  来建个A object 数组的模型的这样的:

                ----------
                        |          |      A[2]
                        ----------
                         ...

请问下 这个应该只是一种通用的实现方式吧 标准不太可能规定这个
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP