如何防止编码器返回局部变量作为参考?
示例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。
答案 0 :(得分:1)
首先不要忽略编译器给你的警告。
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>
这是一个严重的&#34; (第1级)警告。即使是最不严肃的&#34; (在VS的情况下为4级)警告可能是致命的。在最高(最不严重)级别拍摄零警告。您可能无法通过更改代码来消除所有这些代码,但您必须了解它们的原因。如果没有其他办法让他们沉默,你可以根据具体情况禁用每个实例,并且你绝对确定它们是无害的。
为什么这样?简单:如果每次编译代码时都会弹出一堆完全无害的警告,那么你就会停止关注,而你引入的下一个严重警告也会被忽视。
让编译器将警告视为错误非常有用。作为一项政策问题,我总是在我的项目中启用此设置。