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
例如:
在实现过程中不能简单的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; // 释放数组
(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; // 释放数组
相关文章推荐
- c++下new与delete基础用法
- c++ new/delete的用法
- c++中new和delete操作符用法
- c++中new和delete的用法
- C++:new和delete的用法
- C++中 new/delete 概念和用法总结
- c/c++笔试题——C++中 new/delete 概念和用法总结
- 示例解析 C++ 的 new / delete 和 new [] / delete [] 之用法
- C++中operator new 和 new operator小结以及对new 和 delete初步理解
- c/c++笔试题——C++中 new/delete 概念和用法总结
- C++ 关于new和delete的一些简单用法
- C++ - new delete 高维数组小结
- C++中new和delete的用法注意。
- C++之new和delete的用法
- c++ delete的用法小结
- c++ delete的用法小结,二维多维new,类[]的delete[]
- 【C++】编程小结① -- new和delete
- C++中new和delete用法
- C++中new和delete的用法
- C/C++中new/new[]和delete/delete[]的用法比较