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

时间:2023-01-29 14:33:10


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)[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; // 释放数组