• 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时也不要用[]。

  • 相关阅读:
    LeetCode. 476. Number Complement
    LeetCode 172.Factorial Trailing Zeroes
    原码,反码,补码笔记
    python3笔记
    django笔记(python web框架)
    mysql 8.0 主从复制配置
    centos 7系统安装mysql 8.0
    MobaXterm无法退格删除
    Oracle数据泵常用命令
    oracle查年度周末日期
  • 原文地址:https://www.cnblogs.com/DanielZheng/p/2014456.html
Copyright © 2020-2023  润新知