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

    对应的new和delete要采用相同的形式

      我们看下面的代码:

        string *stringArray=new string[100];

        ...

        delete stringArray;

      上述代码看上去没错,实际上程序的运行情况将是不可预测的。stringArray指向的100个string对象中的99个不会被正确的摧毁,因为他们的析构函数永远不会被调用。

      使用new的会触发两件事情。首先内存被分配,然后为被分配的内存调用一个或多个构造函数。同样,调用delete时也会触发两件事情。首先是为将被释放的内存调用一个或多个析构函数,然后是释放内存。这里,对于一个delete操作而言会有这么一个问题:内存中有多少个对象要被删除?这个答案决定了有多少个对象要被析构。

      这个问题等同于:要被删除的指针对象指向单个对象,还是指向一个对象的数组?这里需呀由程序员显示告诉编译器。如果你在使用delete时没有使用[]符号,那么delete就认为要删除的是单个对象,反之则认为是对象数组,所以正确的代码如下:

        string *stringPtr1=new string;

        string *stringPtr2=new string[100];

        ...

        delete stringPtr1;

        delete [] stringptr2;

      如果你在stringPtr1前面加了[],那么结果将是不可预测。如果你在stringPtr2前面没有加[],那么结果同样是不可预测。

      这条规则简单记忆为:如果new的时候用了[],调用delete的时候也要用[]。如果new的时候没有用[],那么调用delete时也不要用[]。

  • 相关阅读:
    函数式编程笔记
    Java时间类总结
    【问题记录】MySQL中时间戳转日期格式和Java中时间戳转日期格式偶尔不一致
    Java 注解
    Java编程思想之十 内部类
    Java编程思想之九 接口
    Java编程思想之八多态
    Java编程思想之七复用类
    Java编程思想之六访问权限控制
    Java编程思想之五初始化与清理
  • 原文地址:https://www.cnblogs.com/DanielZheng/p/2014456.html
Copyright © 2011-2022 走看看