C++边边角角(一)

#include <stdio.h>
#include <stdlib.h>
struct A
{
int a;
int b;
int c;
A() {a=0; printf("A()/n");}
A(int _a) {a=_a;}
~A() {printf("~A()/n");}

void *operator new[](unsigned int s)
// 无论如何 's'传递的是大小,而不是数组元素个数
// gcc编译环境下这个值是 sizeof((n) * sizeof(A))+4,
// 估计这4字节用来作为起始保留

// 这样delete[]也需对应实现
{
int n = (s-4)/sizeof(A);
printf("new[](int n) ... %d, %d/n", s, n);
return ((char*)malloc(s) + 4); // ex-handling omitted
}
void*operator new(unsigned int s, A*p)
{
int n = (s+sizeof(A))/sizeof(A);
printf("new[](unsigned int s, A*p) ... %d,%d/n", s, n);
for (int i = 0; i < n; i++)
{
p[i].~A();
}
return (void*)p;
}
void*operator new[](unsigned int s, A*p)
{
int n = (s-4)/sizeof(A);
printf("new(unsigned int s, A*p) ... %d,%d/n", s, n);
for (int i = 0; i < n; i++)
{
p[i].~A();
}
return (void*)p;
}
};
int main(void)
{
//由`A'指示调用new ...(..., A*p)系列
A *pa = new A[32];
A *pp = new (pa) A[16]; //看似很不错的机制,ICOM指出在含virtual function继承情形下这个足以制造C++语言矛盾
A *p2 = new (pa) A(2);
for (int i = 0; i < 32; i++)
{
printf("a[%d]=%d/n", i, pa[i].a);
}
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值