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

时间:2019-02-09 15:06:49

标签: c++ warnings destructor

下面的代码是模拟数组的基本类。

析构函数使用g ++发出警告:

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

我设置错误的方式吗?过去我是这样使用变量“ initialized”的,没有任何警告。

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的信息吗?

1 个答案:

答案 0 :(得分:0)

编译器会发现,如果使用默认构造函数创建对象,则ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT city , MIN(LENGTH(city)) as charsize , ROW_NUMBE' at line 2 不会被初始化。可以销毁默认的构造对象,并在析构函数中访问my_array的值,如果未初始化,它将具有未定义的行为。

当然,您可能已经建立了一个不变性,即my_array仅在初始化initialized的情况下才成立,但是编译器将无法证明这一点。


您可以通过删除my_array成员来简化类,并通过将initializedmy_array进行比较来替换其所有比较(析构函数中的那个除外;该检查变得多余),并在默认构造函数中将nullptr初始化为my_array。后者的更改解决了警告。