我自己在C ++中有一个函数,它有一个像这样的引用变量
public Draw(sfml::RenderWindow& window)
{
window.draw(Sprite);
}
基本上我将我的renderwindow变量作为对drawObject的引用传递,该drawObject具有一个名为Draw的函数,它接收渲染窗口引用并绘制图像。
函数完成之后,是否会删除窗口引用变量,并且将取消分配内存,或者永远引用引用,并随着越来越多的renderwindow引用而慢慢占用更多内存?
答案 0 :(得分:1)
在C ++中不计算引用参数(或该变量的变量)。出于实际目的,引用就像具有不同语法的普通指针一样,并且它们总是指向有效值(或者您的程序格式错误并调用未定义的行为)。此外,引用不能重新绑定(因此在初始化之后,引用始终引用同一个对象)。
因此,与普通指针一样,引用不会强制对象延长寿命(const type&
绑定返回的值的明显例外)。和指针一样,你必须注意引用引用的对象在任何时候都仍然存在,引用本身就是活着的。
答案 1 :(得分:1)
引用不是对象。它们不一定需要任何内存分配。因此,他们没有一辈子让你担心。
引用的范围是你的Draw
函数,这意味着你将无法从函数外部访问引用,但除了这一点之外。
您需要关注的唯一问题是您的引用引用的对象的生命周期。引用当然可以引用无效对象,因为它引用的对象的生命周期已经结束。
指针是对象。如果您使用了指针,则指针将具有自动存储持续时间,因为它只是一个简单的变量声明。这意味着指针对象的生命周期将持续到函数结束(与其范围相同)。因此即使指针是对象,也没有额外的关注(although pointers in general are usually not the best idea)。
当您开始处理new
和delete
时,对象的分配和释放将变得复杂,这会创建具有动态存储持续时间的对象。你应该尝试avoid this as much as possible。请注意,在int* p = new int(5);
中,它不是您需要担心的指针,而是指针指向的int
。请注意,动态分配引用是不可能的(因为它可能没有任何分配!)。
答案 2 :(得分:0)
所有函数参数,无论它们是内置类型,结构,指针还是引用,都会在函数返回时被清除。
这包括为具有它们的类型运行析构函数。它没有做的是在任何指针上调用delete
或delete[]
- 编译器不知道这是否有意义。例如,printf(const char*, ...)
显然不应该尝试删除文字"Hello, World"
参数。
因此,这实际上是通过函数参数泄漏内存的唯一方法:使用指针(但不是智能指针),传递新对象,忘记在调用者或被调用者中删除它。