zoukankan      html  css  js  c++  java
  • Effective C++ 学习笔记(4)

    尽量使用new和delete而不是malloc和free

      malloc和free是C语言对应的内存操作函数,在C++中无法在分配与释放内存是自动调用构造函数与析够函数。

      使用malloc给10个string对象的数组分配内存:

        string *stringArray1=static_cast<string*>(malloc(10*sizeof(string)));

      stringArray1指向的内存空间的确可以容纳10个string对象,但没有创建这些对象,仅仅只是分配了这么大的内存空间而已。实际使用这些内存初始化数组里的对象将很困难。

      使用new进行同样的操作:

        string *stringArray2=new string[10];

      stringArray2指向10个完全构造好的string对象数组,每个对象可以随意读取string的操作里安全使用。

      但我们想释放stringArray1指向的内存空间时,我们一般会使用以下方式:

        free(stringArray1);

      调用free将会释放stringArray1指向的内存,但内存中的string对象(如果已经初始化了)不会调用析够函数。这样,如果string对象自己另外分配了内存,那么这些内存将会泄漏。

      反观对stringArray2指向内存的释放操作,我们一般使用以下方式:

        delete [] stringArray2;

      数组中的每个对象都会在内存释放前调用析够函数。

      在C++中涉及到对象的操作时,应该尽量选择new和delete来操作内存。

      不可以把new和delete与malloc和free混杂一起。

      对一个用new获取的指针调用free,或者对一个用malloc获取的指针调用delete,后果都是不可预测的。

  • 相关阅读:
    Nginx、PCRE和中文URL(UTF8编码)rewrite路径重写匹配问题
    Nginx 使用中文URL,中文目录路径
    再谈Nginx Rewrite, 中文URL和其它
    事务管理
    commons-dbcp连接池的使用
    JDBC操作简单实用了IOUtils
    JDBC进行处理大文件和批处理
    mysql日期函数(转)
    mysql约束(自己原先总结的有点不准)
    mysql笔记(前面自己写的不标准有些地方)
  • 原文地址:https://www.cnblogs.com/DanielZheng/p/2014142.html
Copyright © 2011-2022 走看看