提问人:manjiri bangale 提问时间:7/8/2022 最后编辑:sepp2kmanjiri bangale 更新时间:7/8/2022 访问量:251
删除警告 C6001
Remove the warning C6001
问:
我正在使用 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;
}
}
}
}
提前感谢您的帮助和指导
答:
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。
评论