1.分配内存初始化标量类型(如 int 或 double),在类型名后加初始值,并用小括号括起,C++11中也支持大括号。程序员
int * pi = new int (6); double * pd = new double (9.99); //C++11中, 支持如下写法 int * pi = new int {6}; double * pd = new double {9.99};
2.初始化结构或数组,须要使用大括号列表初始化 ,需编译器 支持 C++11。数组
struct where{double x; double y; double z;}; where * one = new where {1.2, 2.2, 3.2}; int * ar = new int [4] {1, 2, 3, 4};
3.使用 delete 释放 new分配的内存 (仅限于常规 new 分配的 堆内存)函数
delete pi; delete pd; delete one; // 释放数组 记住 加[] delete [] ar;
4.建立类对象spa
(1)new建立对象,pTest用来接收对象指针。new申请的对象,则只有调用到delete时才会执行析构函数,若是程序退出而没有执行delete则会形成内存泄漏:指针
CTest* pTest = new CTest(); delete pTest;
(2)不用new,直接使用类定义申明,使用完后不须要手动释放,该类析构函数会自动执行:code
CTest mTest;
(3)使用普通方式建立的类对象,在建立之初就已经分配了内存空间。而类指针,若是未通过对象初始化,则不须要delete释放:对象
CTest* pTest = NULL;
1.常规分配内存,调用构造函数。分配失败时,抛出异常。定义以下:内存
void* operator new(std::size_t) throw(std::bad_alloc);编译器
void operator delete(void *) throw();编译
分配失败则抛出异常std::bad_alloc,不是返回NULL,因此判断返回值是否为NULL是没用的。
char *p=new char[size]; //分配失败,不是返回NULL delete [] p;
2.不抛出异常。分配失败时,返回NULL。定义以下:
void* operator new(std::size_t,const std::nothrow_t&) throw();
void operator delete(void*) throw();
char *p=new(nothrow) char[size]; //分配失败,是返回NULL if(NULL==p) cout<<"alloc failure!"<<endl;
运算符new 和 new [] 分别调用以下函数:
void * operator new(std::size_t); //use by new void * operator new [] (std::size_t); //use by new []
运算符delete 和 delete [] 分别调用以下函数:
void * operator delete(void *); //use by delete void * operator delete [](void *); //use by delete []
这些函数称为 分配函数 ,位于全局名称空间中。std::size_t 是一个 typedef。
例:
int * pi = new int; //将转换为下面这样 int * pi = new (sizeof(int)); int * pi = new int[40]; //将转换为下面这样 int * pi = new (40 * sizeof(int)); //一样的 delete pi; //将转换为下面这样 delete (pi);
一般,new负责在 堆 中分配一个足以知足要求的内存块,但 定位new可让程序员指定要使用的内存位置。不会内存分配失败,由于它根本不分配内存,只调用对象的构造函数。它容许在一块已经分配成功的内存上从新构造对象或对象数组。定义以下:
void* operator new(size_t,void*);
void operator delete(void,void);
1.使用 定位new运算符,首先要包含 头文件 new
#include<new> using namespace std; struct chaff { char dross[20]; int slag; }; char buffer1[50]; char buffer2[200]; int main() { chaff * p1, p2; p2 = new (buffer1) chaff; // 在buffer1中 p2 = new (buffer2) int[20]; // 在buffer2中 }
2.使用placement new构造起来的对象或数组,要显式调用它们的析构函数来销毁(析构函数并不释放对象的内存),千万不要使用delete.这是由于placement new构造起来的对象或数组大小并不必定等于原来分配的内存大小,使用delete会形成内存泄漏或者以后释放内存时出现运行时错误。
3.当使用new运算符定义一个多维数组变量或数组对象时,它产生一个指向数组第一个元素的指针,返回的类型保持了除最左边维数外的全部维数。