1.首先分析下new与operator new 的区别
(1). string *ps=new string("memory");
这里所使用的new就是所谓new operator,是由C++语言内建的,不能改变意义,总是做相同的事情。
这个动作的含义分为两方面:
第一,它分配足够的内存,用来放置某类型的对象。对于上例而言,它分配足够放置一个string 对象内存。
第二,它调用一个构造函数,为刚才分配的内存中的那个对象设定初始值。
不能改变其行为。
(2) 能够被重写或者重载的函数是operator new
void * operator new (size_t size);
其返回类型void*。即返回一个指针,指向一块原始的、未设置初始值的内存。
函数中的size_t参数表示需要分配多少内存,你可以将operator new 重载,加上额外的参数,但第一个参数类型必须总是size_t。
它不调用构造函数,只是简单分配内存空间。
string *fu = (string *)operator new(sizeof(string));
//cout << (string)(*fu) << endl; //wrong
string temp = "fuxinghua";
fu = &temp;
cout << (*fu) << endl;
(3)placement new 再指定内存空间创建对象,并且调用构造函数
基本格式为:
A *p = new (ptr)A
例如:
#include<new>(4)用new分配二维数组
#include<iostream>
using namespace std;
class A {
private:
int num;
public :
A(){
num = 5;
cout << "A" << endl ;}
void show(){
cout << num << endl;
}
};
int main()
{
char memory[100];
memory[0] = 'a';
cout << (void *)memory << endl;
memory[1] = 1;
cout << (void * )memory << endl;
A*p = new (memory) A;
cout << p << endl;
p->show();
return 0;
}
在实现过程中不能简单的int **a = new int[5][6]; // wrong
主要有三种方法:
a) int (*a)[n] = new int [m][n]; // n必须为已知
b) int ** ga = new int *[6];
for(int i = 0 ;i<6;i++)
{
ga[i] = new int [5];
}
for(int i = 0; i < 6; i++)
delete []ga[i];
delete []ga;
直观但是比较繁琐
c) int *a = new int [m*n];
连续存储,不够直观
2.delete的用法就比较简单了,但是,每一个动态分配行为都必须匹配一个相应的释放动作
(1) delete a; //释放单个int的空间
(2)delete [] a; // 释放数组