new和delete

来源:互联网 发布:无线wifi覆盖网络拓扑 编辑:程序博客网 时间:2024/06/06 07:21

用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; // 正确
0 0
原创粉丝点击