析构函数提供删除资源的"may be used uninitialized"
destructor giving "may be used uninitialized" for deleting resource
下面的代码是模拟数组的基本类。
析构函数使用 g++ 发出警告:
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?
编译器
会看到,如果使用默认构造函数创建对象,则不会初始化my_array
。可以销毁默认构造的对象,并在析构函数中访问my_array
的值,如果未初始化,该值将具有未定义的行为。
当然,您可能已经建立了一个不变量,该不变性仅在初始化my_array
时才initialized
为真,但编译器将无法证明这一点。
可以通过删除 initialized
成员来简化类,并将其所有比较替换为将my_array
与nullptr
进行比较(析构函数中的比较除外;该检查变为冗余(,并将my_array
初始化为默认构造函数中的nullptr
。后一项更改解决了警告。
相关文章:
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- 这对"With a stackless coroutine, only the top-level routine may be suspended."意味着什么
- 为什么我会" void value not ignored as it ought to be"?
- 如何解决"no Qt platform plugin could be initialized"问题?
- C++/SDL "initial value of reference to a non-const must be an lvalue"
- 如何修复输出日志中的"EnableInput can only be specified on a Pawn for its Controller"错误
- _BitScanForward64 can not be found
- 为什么"types may not be defined in parameter types"
- 冲刺错误"variable may be unsafe" (C4996)...选择?
- 析构函数提供删除资源的"may be used uninitialized"
- 在执行时收到错误"fopen': This function or variable may be unsafe."
- "Only non-static member functions may be virtual"
- 如何修复错误" Variable-sized object may not be initialized "?
- "A reference may be bound only to an object",为什么"const int &ref = 3;"有效?
- "warning: operation of ... may be undefined"用于三元操作 - 不是if/else块
- 禁用优化时没有"may be used uninitialized"
- "Cannot evaluate function -- may be in-lined" STL 模板容器的 GDB 错误
- 为什么" 'static' may not be used when defining (as opposed to declaring) a static data member"?
- VS 2010 C++智能感知 "a storage class may not be specified here"即使它可以?