c++ - 删除引用

标签 c++

这有效吗?可接受的做法?

typedef vector<int> intArray;

intArray& createArray()
{
    intArray *arr = new intArray(10000, 0);

    return(*arr);
}


int main(int argc, char *argv[])
{

    intArray& array = createArray();

    //..........

    delete &array;

    return 0;
}

最佳答案

代码的行为将是您的预期行为。现在,问题是,虽然您可能认为编程是为编译器编写一些东西来处理,但它同样是关于编写其他程序员(或将来的您)能够理解并能够维护的东西。您提供的代码在很多情况下相当于使用了编译器的指针,但对于其他程序员来说,它只是一个潜在的错误来源。

引用旨在成为在其他地方管理的对象的别名,以其他方式管理。通常人们在遇到 delete &ref 时会感到惊讶,而且在大多数情况下,程序员不会期望必须对引用的地址执行 delete,所以很有可能将来有人会调用该函数而忘记删除,您将遇到内存泄漏。

在大多数情况下,使用智能指针可以更好地管理内存(如果您不能使用其他高级构造,例如 std::vectors)。通过将指针隐藏在引用后面,您会更难在返回的引用上使用智能指针,因此您无济于事,反而使用户更难使用您的界面。

最后,关于引用的好处是,当您在代码中阅读它们时,您知道对象的生命周期在其他地方进行管理,您无需担心。通过使用引用而不是指针,您基本上回到了单一解决方案(以前在 C 中只有指针)并且突然必须格外小心所有引用以确定是否必须在那里管理内存。这意味着更多的努力,更多的时间来考虑内存管理,更少的时间去担心正在解决的实际问题——由于异常代码的额外压力,人们习惯于用指针寻找内存泄漏,并期望没有引用.

简而言之:通过引用保存内存对用户隐藏了处理内存的要求,并使其更难正确处理。

关于c++ - 删除引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3233987/

相关文章:

c++ - DLL 注入(inject)的最佳实践?

c++ - 将文件转换为二进制 c++ studio 2012 的问题

c++ - OpenGL 在 Z 缓冲区和深度测试方面遇到问题

c++ - 在 Xcode : -libmysqlcppconn library not found 中使用 MySQL Connector/C++

c++ - 映射到任何结构

c++ - 如何从 bmp 图像 C++ 纹理中获取 Sprite 集

c++ - 为外部 DLL 设置 OMP 线程数

c++ - OpenCV: ‘AlgorithmInfo’ 在构建 opencv_contrib 时未命名类型

c++ - 使用枚举方向列表时反转方向(从左到右或从上到下)

c++ - 结构构造函数名称优先级