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