Warning 6011 in C++
Warning 6011 in C++
我不明白如果我收到这个警告的含义。我的代码编译,但有一半时间无法读取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++ 中将构造函数添加到结构中。
- netcat command in c++
- Difference in displaying cv2 Mat
- C++ MFC Libraries in Travis CI
- 如何在OpenSSL中从configuration.h.in获取configuration.h
- 创建具有 new in 函数和"this is nullptr"异常的对象
- IN, OUT, INOUT Parameters
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 有人安装"IITB Simplecpp in mac"吗?
- 从 C 样式字符串中删除子字符串 "in place" 在C++代码中
- 如何修复"error: ‘_1’ was not declared in this scope"?
- Softmax Implementation in C++
- 将 out/in out 参数与 if/switch 的 init 语句一起使用
- IF-nesting in c++
- Gurobi GRBModel and GRBmodel in C++
- Tensorflow Hub in C++
- Centos7 g++ "to_string is not in a member of std"
- InitializeCriticalSectionEx Not Located In KERNEL32.Dll
- 将 lambda 表达式传递给 std::function in C++
- @CPPFLAGS@在 Makefile.in 中意味着什么?
- std::async from std::async in windows xp