您的位置:首页 > 编程语言 > C语言/C++

c++中new与delete的用法小结

2011-08-05 10:41 399 查看
1.首先分析下new与operator new 的区别

(1). string *ps=new string("memory");

这里所使用的new就是所谓new operator,是由C++语言内建的,不能改变意义,总是做相同的事情。

这个动作的含义分为两方面:

第一,它分配足够的内存,用来放置某类型的对象。对于上例而言,它分配足够放置一个string 对象内存。

第二,它调用一个构造函数,为刚才分配的内存中的那个对象设定初始值。

不能改变其行为。

(2) 能够被重写或者重载的函数是operator new

函数 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>
#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;

}
(4)用new分配二维数组

在实现过程中不能简单的int **a = new int[5][6]; // wrong

主要有三种方法:

a) int (*a)
= new int [m]
; // 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; // 释放数组
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: