Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 防止编码器错误-通过引用返回临时值(悬空指针)_C++_Visual Studio_Dangling Pointer - Fatal编程技术网

C++ 防止编码器错误-通过引用返回临时值(悬空指针)

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>&

如何防止编码器返回局部变量作为引用

例1

我有时会犯这样的错误:-

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您的意思是像这样抑制吗?