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、付费专栏及课程。

余额充值