0

如何防止编码器返回局部变量作为参考?

示例 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。

4

1 回答 1

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>

这是一个“严重”(1 级)警告。即使是“最不严重”(在 VS 的情况下为 4 级)警告也可能是致命的。在最高(最不严重)级别拍摄零警告。您可能无法通过更改代码来消除所有这些,但您必须了解为什么要给出它们。如果没有其他方法可以使它们静音并且您绝对确定它们是无害的,请根据具体情况禁用每个实例。

为什么要这样做?很简单:如果每次编译代码时都会弹出一堆完全无害的警告,那么您就会停止注意,并且您引入的下一个严重警告也不会引起注意。

让您的编译器将警告视为错误非常有用。作为政策问题,我总是在我的项目中启用此设置。

于 2017-03-13T08:46:01.883 回答