防止编码器错误 - return 临时值引用(悬挂指针)
Prevent coder error - return temporary value by reference (dangling pointer)
如何防止编码器返回局部变量作为引用?
示例 1
我有时会犯这样的错误:-
int& getStaticCache(){
int cache = 0; return cache; //<--- dangling pointer
}
正确的代码是:-
int& getStaticCache(){
static int cache = 0; return cache; //OK
}
示例 2
另一种情况是:-
std::vector<Protocol>& getInternalController(){ .... some code .... }
std::vector<Protocol>& getController(){
std::vector<Protocol> controller=getInternalController_();
return controller; //<--- dangling pointer
}
正确的代码是:-
std::vector<Protocol>& getController(){
return getInternalController_(); //<--- OK
}
可能只有我一个人,因为我C++不够熟练
但是,这些每 3 个月发生一次,尤其是在不好的时候。
问题:有什么编程技术/设计模式/软件工程术语/C++魔术/工具/插件可以帮助我减少这种特定类型的错误率?
我正在使用 Visual Studio。
从不忽略编译器给你的警告开始。
c:\CODE>type bad.cpp
int& foo()
{
int a = 42;
return a;
}
c:\CODE>cl /c bad.cpp
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.30319.01 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.
bad.cpp
bad.cpp(4) : warning C4172: returning address of local variable or temporary
c:\CODE>
这是 "severe"(1 级)警告。即使是 "least serious"(在 VS 情况下为 4 级)警告也可能是致命的。争取最高(最不严重)级别的零警告。您可能无法通过更改代码来消除所有这些,但是您必须了解为什么会给出它们。如果没有其他方法可以使它们静音并且您绝对确定它们是无害的,请根据具体情况禁用每个实例。
为什么要这样做?很简单:如果每次编译代码时弹出一堆完全无害的警告,您就会停止关注,而您引入的下一个严重警告也不会引起注意。
让您的编译器将警告视为错误非常有用。作为一项政策,我总是在我的项目中启用此设置。
如何防止编码器返回局部变量作为引用?
示例 1
我有时会犯这样的错误:-
int& getStaticCache(){
int cache = 0; return cache; //<--- dangling pointer
}
正确的代码是:-
int& getStaticCache(){
static int cache = 0; return cache; //OK
}
示例 2
另一种情况是:-
std::vector<Protocol>& getInternalController(){ .... some code .... }
std::vector<Protocol>& getController(){
std::vector<Protocol> controller=getInternalController_();
return controller; //<--- dangling pointer
}
正确的代码是:-
std::vector<Protocol>& getController(){
return getInternalController_(); //<--- OK
}
可能只有我一个人,因为我C++不够熟练
但是,这些每 3 个月发生一次,尤其是在不好的时候。
问题:有什么编程技术/设计模式/软件工程术语/C++魔术/工具/插件可以帮助我减少这种特定类型的错误率?
我正在使用 Visual Studio。
从不忽略编译器给你的警告开始。
c:\CODE>type bad.cpp
int& foo()
{
int a = 42;
return a;
}
c:\CODE>cl /c bad.cpp
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.30319.01 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.
bad.cpp
bad.cpp(4) : warning C4172: returning address of local variable or temporary
c:\CODE>
这是 "severe"(1 级)警告。即使是 "least serious"(在 VS 情况下为 4 级)警告也可能是致命的。争取最高(最不严重)级别的零警告。您可能无法通过更改代码来消除所有这些,但是您必须了解为什么会给出它们。如果没有其他方法可以使它们静音并且您绝对确定它们是无害的,请根据具体情况禁用每个实例。
为什么要这样做?很简单:如果每次编译代码时弹出一堆完全无害的警告,您就会停止关注,而您引入的下一个严重警告也不会引起注意。
让您的编译器将警告视为错误非常有用。作为一项政策,我总是在我的项目中启用此设置。