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


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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值