Warning 6011 in C++

Warning 6011 in C++

本文关键字:C++ in 6011 Warning      更新时间:2023-10-16

我不明白如果我收到这个警告的含义。我的代码编译,但有一半时间无法读取inputs

typedef struct a
{
double* inputs;
} A;

我创建了一个新的结构 A:

A* createA(double* inputs) 
{
A* a = (A*)malloc(sizeof(A));
a->inputs = inputs;
}

为什么我在a->inputs = inputs;上收到6011警告?

在Microsoft文档中,它说在喂a->inputs之前测试给定的参数是否NULL,女巫确实是跟踪错误的好习惯。

但即使补充:

A* createA(double* inputs) 
{
A* a = (A*)malloc(sizeof(A));
if (inputs != NULL)
a->inputs = inputs;
else /* error */
}

我仍然收到警告,但在if声明中。

正如@clcto所解释的,这是因为您没有进行错误检查。

如果您不关心 OOM,并且可以使用异常,只需执行以下操作:

struct A
{
double* inputs;
};
A* createA(double* inputs) 
{
A* a = new A;
a->inputs = inputs;
return a;
}

因为new会扔在 OOM 上。如果您无法使用异常和/或想要改为检查返回值,请考虑使用new(std::nothrow).

另请注意struct A上的符号,而不是typedef(C++ 中不需要)。此外,您可能也应该考虑使用std::unique_ptr<A>

问题是malloc在失败时可能会返回NULL。在这种情况下,写入下一行中的a->inputs将取消引用NULL指针,即未定义的行为,应避免。诚然,malloc不太可能失败,但由于您喜欢编写安全代码,因此您应该测试malloc的返回值:

A* a = (A*)malloc(sizeof(A));
if (a != NULL){
a->inputs = inputs;
} else {
/* Handle error */
}

由于您编写C++来自 C 背景,您应该意识到您编写的代码本质上仍然是 C,并且与现代C++非常不同,在现代中,我们做很多事情都非常不同。在C++中,我们喜欢使用许多非常有用的工具和习语。

我假设inputs是一个数字列表。在C++中,我将按如下方式重写您的代码:

// no typedef
struct A {
vector<double> inputs;
};
// no createA
// Example usage:
int main(){
A a;
// no manual memory management!!!
// no pointers!
// how many inputs?
cout << "There are " << a.inputs.size() << " inputsn";
// add two inputs
a.inputs.push_back(3.83);
a.inputs.push_back(1.01);
// print everything
for (const auto& input : a.inputs){
cout << input << " ";
}
return 0;
}

这就是我们现在通常在C++做事的方式。引擎盖下有很多事情发生,但一旦你知道自己在做什么,整体体验就会非常安全和友好。如果你有兴趣,我建议你从这份好书列表中选择C++书,仔细阅读。否则,坚持使用 C 可能是最简单的,如果这是你觉得舒服的。

您的情况存在内存问题,因为在结构 a 中,有指针输入。

未分配输入。您必须分配一些内存,使输入指向它,或者您必须为它分配 NULL,例如在构造函数中(是的,您可以在 C++ 中将构造函数添加到结构中。