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,不过这步可以在析构函数中完成。

  • 相关阅读:
    2015网易校招Java开发工程师(技术架构)在线笔试题
    2015百度校招用户行为分析研发工程师笔试题
    2016届百度实习生前端笔试题上海卷a
    数据库 三范式最简单最易记的解释
    从几个sample来学习JAVA堆、方法区、JAVA栈和本地方法栈
    C++中虚函数和纯虚函数的总结
    MFC一些基本控件操作的总结
    单文档多视图一些基本操作
    MFC单文档静态分割视图
    iOS通讯录相关知识-浅析
  • 原文地址:https://www.cnblogs.com/zhousong918/p/11146769.html
Copyright © 2011-2022 走看看