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
- new, delete 和 new[] delete[]
- new、delete和new[]、delete[]
- new和new[] 和delete 和delete[]
- 关于new和delete,new[] 和delete[]
- 关于new和delete,new[] 和delete[]
- 关于new和delete,new[] 和delete[]
- new和delete && new[] 和delete[]
- new/delete operator和operator new/delete
- C++ 中的 new/delete 和 new[]/delete[]
- C++中的new/delete和new[]/delete[]
- c++ new new[]和 delete delete[] 问题
- 模拟实现new、delete和new[] 、delete[]
- new/delete 和 new[]/delete[] 配套使用
- C++ 中的 new/delete 和 new[]/delete[]
- C++中的new delete和new[] delete []
- C++中的new/delete和new[]/delete[]
- C++ 中的 new/delete 和 new[]/delete[]
- new与delete和new[ ]与delete[ ]
- IPC(五)——浅谈AIDL的架构原理
- HelloCSDN
- Openwrt上Php+Mysql+Lighttpd的安装配置
- iOS 开发— JSONS字符串转字典
- JDK配置环境变量
- new和delete
- 【java】java线程并发测试模版
- Visual Studio 2013 自定义工具 MSLinqToSQLGenerator失败的解决方案
- 给 Android 开发者的 RxJava 详解
- ViewPage轮播
- 修改Oracle Virtual Box中vdi的大小
- iOS开发代码工具————Github Desktop的简介及初步使用
- YTUOJ之十进制与八进制的转换(栈和队列)
- 利用 LeakCanary 来检查 Android 内存泄漏