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

  • 相关阅读:
    Sublime Text 3 Build 3143 可用License
    npm安装cnpm报错
    使用proxy来简单的实现一个观察者
    时间倒计时提醒
    JavaScript设计模式
    异步方法(promise版)出错自调用
    co模块源码学习笔记
    go new() 和 make() 的区别
    广度优先搜索算法
    并发和并行有什么区别?(转)
  • 原文地址:https://www.cnblogs.com/DanielZheng/p/2014456.html
Copyright © 2011-2022 走看看