C++ 将x指定给y所指向的点是否会导致内存泄漏?
我将x指定给y所指向的位置,这会导致内存泄漏吗?如果是,正确的方法是什么C++ 将x指定给y所指向的点是否会导致内存泄漏?,c++,memory-leaks,C++,Memory Leaks,我将x指定给y所指向的位置,这会导致内存泄漏吗?如果是,正确的方法是什么 int *x, *y x = new int; y = new int; *x = 3; *y = 4; x = y; delete x; 是的,这可能是内存泄漏。在将y分配给x之前,通过delete-ingx可以避免内存泄漏。然后,由于x和y指向同一个对象,因此必须删除x和y中的一个(不是两个!) 通常,您应该更喜欢直接调用new和delete。标准库提供了智能指针(如std::unique_ptr)和容器类(如st
int *x, *y
x = new int;
y = new int;
*x = 3;
*y = 4;
x = y;
delete x;
是的,这可能是内存泄漏。在将
y
分配给x
之前,通过delete
-ingx
可以避免内存泄漏。然后,由于x
和y
指向同一个对象,因此必须删除x
和y
中的一个(不是两个!)
通常,您应该更喜欢直接调用new
和delete
。标准库提供了智能指针(如std::unique_ptr
)和容器类(如std::vector
),它们遵循这种有用的模式。当您失去分配跟踪时,会发生内存泄漏。释放内存的唯一方法是将指针保留在某个位置。只要你移动指针,你就可以在以后释放它,但是像这样踩它会导致值丢失
问题在于x=y
行。如果你先删除了x,你就很好了
换句话说,这很好:
删除x;
x=y;
删除x;
但这不是:
x=y;//原来的x指针现在丢失,无法释放
这也不是:
删除x;
x=y;
删除x;
删除y;//上一行的指针已被删除
每一个新的都应该与一个delete
配对。如果一个比另一个多,你就有问题了
换句话说,重要的是特定的指针值,而不是变量。变量只是人类描述编译器正在使用的值的一种方式。如果有疑问,请画图
我们从这里开始:
int *x, *y;
+---------+
| x |-----> ???
+---------+
+---------+
| y |-----> ???
+---------+
我们有两个未初始化的指针,这意味着它们基本上指向“任何地方”
接下来,我们说
x = new int;
y = new int;
+---------+ +----------+
| x |-----> | ???????? |
+---------+ +----------+
+---------+ +----------+
| y |-----> | ???????? |
+---------+ +----------+
指针x
和y
现在指向整数,但由于这些整数尚未初始化,它们的值本质上是“任意的”
进行:
*x = 3;
*y = 4;
+---------+ +---------+
| x |-----> | 3 |
+---------+ +---------+
+---------+ +---------+
| y |-----> | 4 |
+---------+ +---------+
两个行为良好的指针,指向行为良好的整数。啊,多好啊
但不幸的是,悲剧接踵而至:
x = y;
+---------+ +---------+
| x |---+ | 3 |
+---------+ | +---------+
|
+---------+ +-> +---------+
| y |-----> | 4 |
+---------+ +---------+
哦,不!我们把整数3丢了,漂泊在虚空中,没有人喜欢它。这是内存泄漏!多伤心啊
当我们把事情圆满解决时,我们会说
delete x;
+---------+ +---------+
| x |---+ | 3 |
+---------+ | +---------+
|
+---------+ +->
| y |-----> deallocated
+---------+ memory!
现在x
和y
指向解除分配的内存,这本身不是一个问题。这只是发生的事情的结果
是的,你确实有内存泄漏。你能做些什么?那要看你想做什么了@Ray Hamel的想法是在重新分配x
时,使用智能指针自动清理内存。这不是个坏主意。但考虑到这段代码看起来像是一个小示例,旨在让您思考指针,您也可以尝试类似于在重新分配之前释放x
指向的内存。很难说什么是“正确的事情”,因为这个例子实际上没有完成任何“深刻的”事情,如果这有意义的话。是的。另一个答案各不相同,但大多数人会说使用智能指针。是的。一旦您重新输入x
它以前的分配就丢失了。你需要一个删除x代码>在分配之前。@user4581301不希望在注释中回答,而是在回答框中回答。