zoukankan      html  css  js  c++  java
  • C++ new 和 delete

    l new操作符(new operator)

    string *ps = new string(“Memory Management”);

    这里的new是由语言内建的,我们成为new关键字。new操作符做了两件事情:

    1、在堆上分配足够的内存,用来放置某类型的对象;使用operator new进行内存空间分配。

    2、调用constructor构造函数,为刚刚分配的内存空间设置初值。

    new操作符的行为是语言内建的,无法对其行为进行改变。

    l new函数(operator new)

    声明如下:

    void * operator new(size_t size);//是不是很像C中的malloc。

    是的,我们可以将operator new函数类比于C中的malloc函数。

    operator new只做了一件事情,就是分配内存空间,但是没有构造函数,也就是没有完成对分配空间的初始值设定。但是operator new可以重载。

    所以在使用operator new之后一般接下来会对分配的内存空间进行初值设定。

    char *memory = (char*) operator new(sizeof(char)*15);//类似于malloc

    strcpy(memory, “hello world”);

    l Placement new:在已分配的内存(堆和栈)中构造对象

    new (buffer) type(size_t size);

    int data = 123456;

    int *pa = new(&data) int;//pa指针将指向data对象,里面的内容与data保持一致,没有进行覆盖。

    int *pb = new(&data) int(123);//pb指针同样指向data对象,里面的内容将用123进行覆盖。

    l delete释放内存,调用类的析构函数

    delete p;//or delete [] p;

    调用delete后,只是告诉了系统被delete掉的地址空间可以进行重新分配了。但是并未将p中的地址清除,也就是在delete后使用*p还是能够得到内容,但是其中的内容就不可以预测了,可能系统重新将之前的内存空间分配出去,并设置了其他的值。所以在delete之后我们一般会将对应的delete对象设置为null。

    delete p;

    p = null;

    l delete函数(operator delete)

    p->~string();

    operator delete(p);

    最后一步也是讲p重置为null,不过这步可以在析构函数中完成。

  • 相关阅读:
    Mac item 远程连接服务器
    搭建私人Git Server
    数据结构第三章小结
    第二章实践小结
    poj3617 Best Cow Line
    最长上升子序列问题
    Uva11450 Wedding shopping
    poj3050 hopscotch
    poj2718 Smallest Difference
    poj3669 Meteor Shower
  • 原文地址:https://www.cnblogs.com/zhousong918/p/11146769.html
Copyright © 2011-2022 走看看