析构函数给出“可以用来初始化”删除资源

问题描述 投票:0回答:1

下面的代码是一个基本的类来模拟阵列。

析构函数是给相克++警告:

warning: ‘*((void*)(&<anonymous>)+8).s_array<int>::my_array’ may be used uninitialized in this function [-Wmaybe-uninitialized]
       delete [] my_array;

我在此设置了错误的方式?使用“初始化”像这样的变量是,我如何在过去做到了这一点,没有任何警告。

template<class TYPE>
class s_array{
private:
  int my_size;
  TYPE * my_array;
  bool initialized;

public:

  s_array(){initialized=false;}
  s_array(int size){
    initialized=true;
    my_size=size;
    my_array=new TYPE[my_size];
  }

  s_array(const s_array& source){
    if (source.initialized==true){
      initialized=true;
      my_size=source.my_size;
      my_array=new TYPE[my_size];
      for (int i=0; i<my_size; i++)
       my_array[i]=source.my_array[i];
    }
    else
      initialized=false;
  }
  s_array& operator= (const s_array& source){
    if (&source!=this){
      if (source.initialized==true){
       initialized=true;
       my_size=source.my_size;
       my_array=new TYPE[my_size];
        for (int i=0; i<my_size; i++)
         my_array[i]=source.my_array[i];
      }
      else
    initialized=false;
    }
    return *this;
  }
  ~s_array(){
    if (initialized)
      delete [] my_array;
  }
    TYPE operator [](int i) const    {
      assert(i>=0 && i<my_size);
      return my_array[i];
    }
    TYPE & operator [](int i) {
      assert(i>=0 && i<my_size);
      return my_array[i];
    }

};

尤其是有一些关于与初始化是防止编译器无法看到它对应于my_array被初始化的流量?

c++ warnings destructor
1个回答
0
投票

编译器看到的是,如果您创建使用默认构造一个对象,然后my_array将不会被初始化。默认的构造的对象可以被摧毁,并在析构函数可以访问这将有不确定的行为,如果它不初始化my_array的价值。

当然,你可能已经建立了不变,如果initialized被初始化,但是编译器将无法证明该my_array是唯一的真。


您可以通过删除initialized成员简化类,并与比较my_arraynullptr取代所有的比较(除了一个在析构函数,该检查变得多余),并初始化my_array在默认构造函数nullptr。后者改变解决了警告。

© www.soinside.com 2019 - 2024. All rights reserved.