【问题标题】:Is the *bool array being deleted correctly C++*bool 数组是否被正确删除 C++
【发布时间】:2015-02-10 22:28:52
【问题描述】:

我正在尝试缩小 *bool 的数组,但我不确定它是否被正确删除。

这是我的源代码...

bool *oldStore;


void shrinkArray(int i)
{
    int k;
    bool *newStore;
    for(k=0; k<i; k++)
    {
        newStore[k] = oldStore[k];
    }

    for(; k<originalSize; k++)
    {
        delete[] oldStore[k];
    }

    delete[] oldStore;
    oldStore = newStore;
}

例如,如果我想将数组缩小到5,并且数组的原始大小是15,它将保留前五个并删除后十个,但是我不太确定我的记忆是否管理得当。

【问题讨论】:

  • 您不应该删除数组中的每个条目。只有deletenew,只有delete[]new[]。但是,在您的情况下,不需要动态分配的数组,当您认为“动态数组”时,您应该考虑std::vector
  • 你甚至从未初始化指针newStore,或分配任何东西。这可能会在第一次使用newStore[k] 时崩溃。但除了在许多方面不正确之外,这种方法无论如何都非常原始。

标签: c++ arrays pointers memory-leaks delete-operator


【解决方案1】:

在进入编码细节之前考虑一下你的方法设计。我假设您在代码中的某个位置有一个新的 ínt 数组。

  1. 想想谁“拥有”这个数组?在某个地方创建 int 数组并在其他地方简单地 delete[] 它可能不是一个好主意。查看以下链接:What is a smart pointer and when should I use one?

  2. 想想你的 newStore 数组会发生什么。它应该替换 oldStore 还是您希望两个数组并行存在。如果您只是将 newStore 放在堆上,您将在何时何地再次删除它。

【讨论】:

    【解决方案2】:

    最简单的代码是:-

    void shrinkArray(int i)
    {
        int k;
        bool *newStore = new bool[i];
        for(k=0; k<i; k++)
        {
            newStore[k] = oldStore[k];
        }
    
        delete [] oldStore;   //assuming oldstore was allocated using new []..
        oldStore = newStore;
    

    }

    【讨论】:

      【解决方案3】:

      您的代码错误。您声明了指针newStore,但既没有初始化它,也没有分配该指针指向的内存

      bool *newStore;
      

      所以下一个循环有未定义的行为。

      for(k=0; k<i; k++)
      {
          newStore[k] = oldStore[k];
      }
      

      此外,如果指针oldStore 指向的数组的每个元素都具有bool * 类型,而bool * 又是一个指针,那么oldStore 本身应具有bool ** 类型

      如果是这样,那么正确的函数可能看起来像

      void shrinkArray( int n )
      {
          if ( n < originalSize )
          {
              bool **newStore  = new bool * [n];
      
              int i = 0;
              for ( ; i < n; i++ ) newStore[i] = oldStore[i];
      
              for ( ; i < originalSize; i++ ) delete oldStore[i];
      
              delete [] oldStore;
      
              oldStore = newStore;
              originalSize = n;
          }
      }
      

      考虑到oldStore 也应该有bool ** 类型。

      否则,如果原始数组的每个元素的类型为bool,那么代码将如下所示

      void shrinkArray( int n )
      {
          if ( n < originalSize )
          {
              bool *newStore  = new bool [n];
      
              int i = 0;
              for ( ; i < n; i++ ) newStore[i] = oldStore[i];
              // Or
              // std::copy( oldStore, oldStore + n, newStore );
      
              delete [] oldStore;
      
              oldStore = newStore;
              originalSize = n;
          }
      }
      

      考虑到使用标准容器std::vector&lt;bool *&gt;std::vector&lt;bool&gt; 会更好更简单,具体取决于容器元素的类型。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-30
        • 1970-01-01
        • 2016-05-30
        • 1970-01-01
        • 2023-02-10
        相关资源
        最近更新 更多