C++ 防止编码器错误-通过引用返回临时值(悬空指针)
如何防止编码器返回局部变量作为引用 例1 我有时会犯这样的错误:-C++ 防止编码器错误-通过引用返回临时值(悬空指针),c++,visual-studio,dangling-pointer,C++,Visual Studio,Dangling Pointer,如何防止编码器返回局部变量作为引用 例1 我有时会犯这样的错误:- int& getStaticCache(){ int cache = 0; return cache; //<--- dangling pointer } 例2 另一个例子是:- std::vector<Protocol>& getInternalController(){ .... some code .... } std::vector<Protocol>&
int& getStaticCache(){
int cache = 0; return cache; //<--- dangling pointer
}
例2
另一个例子是:-
std::vector<Protocol>& getInternalController(){ .... some code .... }
std::vector<Protocol>& getController(){
std::vector<Protocol> controller=getInternalController_();
return controller; //<--- dangling pointer
}
正确的代码是:-
int& getStaticCache(){
static int cache = 0; return cache; //OK
}
std::vector<Protocol>& getController(){
return getInternalController_(); //<--- OK
}
也许只是我,因为我在C++方面不够熟练。
然而,我每三个月就会发生一次,尤其是在不好的时候
问题:什么编程技术/设计模式/软件工程术语/ 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>
这是一个严重的1级警告。在VS警告的情况下,即使是最轻微的4级也可能是致命的。在最高最低严重级别拍摄零警告。您可能无法通过更改代码来消除所有这些问题,但您必须理解为什么会给出这些问题。如果没有其他方法使每个实例保持沉默,并且您绝对确定它们是无害的,请逐个禁用每个实例
为什么要这样做?很简单:如果每次编译代码时都会出现一堆完全无害的警告,那么您就不再注意,而您引入的下一个严重警告就不会被注意到
让编译器将警告视为错误非常有用。作为一项政策,我总是在我的项目中启用此设置 正确的代码是。。。小心一厢情愿。正确的解决方案是返回一个值而不是一个引用。特别是当返回一个整数时,返回引用通常是没有意义的。@n.m.我是一个乐观的人。这也是我问题的根源吗?希望不是@一些程序员有时我需要它。。。。。。在第一个示例中:它是模板类型中的一个字段-我必须在使用之前强制初始化变量。唯一的方法是把它作为一个静态变量放入函数中。。。。。在第二个示例中,这是出于性能原因。static int cache=0;返回缓存;是一系列其他问题的根本原因。我注意到这是编译器警告级别1。它是指最严重的还是最不严重的?哦,我看这是最严重的。感谢我不应该关掉警告。XD@javaLover即使是最不严重的警告也可能是致命的。在最高最低严重级别拍摄零警告。您可能无法通过更改代码来消除所有这些问题,但您必须理解为什么会给出这些问题。逐个禁用每个实例。是的,n.m.先生,我会优雅地接受您的建议。启用编译器的“将警告视为错误”选项,以便警告不会丢失。如果您有一个真实的假阳性警告,请使用注释来抑制它。@Sebastian Redl您的意思是像这样抑制吗?