new和delete

用new的时候会发生两件事。首先,内存被分配,然后为被分配的内存调用一个或多个构造函数。用delete的时候,也有两件事情发生:首先,为将被释放的内存调用一个或多个析构函数,然后,释放内存。
当你new一个数组对象的时候,其实内核会为你多分配四个字节来存储对象的个数。这样delete[]的时候就可以知道该释放多少个。而如果你在delete的时候没有加上[],编译器会认为这只是一个对象,不会去看存储了多少个对象。会出现有一部分没删掉。所以delete和delete[]要区分开。

int main()
{
    int *ptr=(int *)malloc(sizeof(int));//c语言,释放要用free
    int *pptr=new int();//C++,格式 new type()  
    //()表示初始值
    cout<<*ptr<<endl;//随机值0xcdcdcdcd
    int a=int();//对内置类型int(),调用默认构造函数
    cout<<a<<endl;//打印0,称为0初始化

int *p=(int*)malloc(sizeof(int)*100);//分配数组
int *p1=new int[100];//格式new type[],[]表示开辟数组内存
//int *p1=new int[100]();错误,只有开辟单个内存时才能赋初值
}

重复释放野指针,什么时候奔溃,什么时候不奔溃?
1、在成员函数中对成员变量进行操作 。

    void function(const TestClass *this){printf("");}
    p->funtion();//被编译成function(p);

普通成员函数必须经由一个对象来调用(经由this指针),那么delete p之后,p指针将会指向一个无效的地址,然而p本身是一个有效的变量,因此能编译通过。并且在编译通过之后,由于TestClass ::Function的函数体内并未对这个传入的指针进行任何操作,这里野指针就被看作是安全的。
2、将成员函数声明为虚函数
那么C++在构建对象时,会为之分配一个虚函数表vptable。vptr是一个指针,它指向一个函数指针的数组,数组中的成员即是类中声明的所有虚函数。在调用虚函数时经由这个vptr。p->Function()被解析成(*p->vptr[1])(p);p指向无效的地址,必然是非法操作。

typedef string AddressLines[4];
因为 AddressLines 是个数组,使用 new:
string *pal = new AddressLines; // 注意"new AddressLines"
                                //返回 string*, 和"new string[4]"返回的一样

delete 时必须以数组形式与之对应:
delete pal; // 错误!
    delete [] pal; // 正确
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值