这有效吗?可接受的做法?
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::vector
s)。通过将指针隐藏在引用后面,您会更难在返回的引用上使用智能指针,因此您无济于事,反而使用户更难使用您的界面。
最后,关于引用的好处是,当您在代码中阅读它们时,您知道对象的生命周期在其他地方进行管理,您无需担心。通过使用引用而不是指针,您基本上回到了单一解决方案(以前在 C 中只有指针)并且突然必须格外小心所有引用以确定是否必须在那里管理内存。这意味着更多的努力,更多的时间来考虑内存管理,更少的时间去担心正在解决的实际问题——由于异常代码的额外压力,人们习惯于用指针寻找内存泄漏,并期望没有引用.
简而言之:通过引用保存内存对用户隐藏了处理内存的要求,并使其更难正确处理。
关于c++ - 删除引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3233987/