删除警告 C6001

Remove the warning C6001

提问人:manjiri bangale 提问时间:7/8/2022 最后编辑:sepp2kmanjiri bangale 更新时间:7/8/2022 访问量:251

问:

我正在使用 VS2017,不明白为什么我在 catch 块中在线 if(values!= NULL) 收到编译器“警告 C6001 使用未初始化的内存'values'”。

#include <windows.h>

typedef enum 
{        
   VALUE_STATE_NOT_AVAILABLE = 1,
   VALUE_STATE_ERROR         = 2,
   VALUE_STATE_VALID         = 3,
   VALUE_STATE_UNKNOWN       = 4
} XyzValueState_t;
    
class XyzValue
{
    private:    XyzValueState_t     _valueState;
    protected:  XyzValue( XyzValueState_t valueState )  {
                    _valueState = valueState;
                }
}

typedef XyzValue* xyzValuePtr_t;

main(){
    bool flag=true;
    xyzValuePtr_t* values = NULL;
    unsigned int _argument=2;
    if(flag==true)  {
        values = new PCLValuePtr_t[2]{ NULL,NULL }; 
        try     {
            values[0] = new PCLUnsignedInteger(_argument);
            values[1] = new PCLUnsignedInteger(_argument);
            xyz(values);    // passing the value to third party function which returns void
        }
        catch(...)  {
            if(values!= NULL){
                for(int k = 0; k < 1; k++)  {
                   delete values[k];
                   values[k] = NULL;      
                }
                delete [] values;
                values = NULL;
            }
        }
    }
}

提前感谢您的帮助和指导

C++ 警告

评论

0赞 Some programmer dude 7/8/2022
您显示的代码不是一个最小的可重现示例。我无法复制粘贴它以自己复制警告。如当前所示,它在尝试构建时会给出太多错误。请花一些时间阅读帮助页面,参加 SO 导览,阅读如何提问,以及这个问题清单。然后,请学习如何编辑您的问题以改进它们。

答:

0赞 Marcus Müller 7/8/2022 #1

不太确定为什么您的编译器认为这可能是单一化的。

但是,在 C++ 中,我认为构建数组的方式不必要地复杂且容易出错。这看起来像是 1993 年的某个人试图编写 C++11。您有初始值设定项列表,但您不使用 RAII!new

因此,执行 C++ 操作并使用 C++ 的确定性对象生存期来管理内存。对于对象数组,这可以通过以下方式优雅地处理:std::vector

#include <vector>
class XyzValue;

main(){
    bool flag=true;
    unsigned int _argument=2;
    if(flag==true)  {
        std::vector<XyzValue> values(2);  // default initialization for two XyzValues.
        try     {
            xyz(values.data());    // if you need the raw contiguous memory. **You probably don't.**
        }
        catch(...)  {
// all the manual deletion not necessary anymore, because at end of scope, things are deconstructed automatically, so this catch clause now is empty.
        }
    }
}

看看它如何更短,可读性更好,具有相同的功能,但不需要手动删除任何内容?这就是为什么我们写C++而不是C。