C++ 将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

我将x指定给y所指向的位置,这会导致内存泄漏吗?如果是,正确的方法是什么

int *x, *y
x = new int;
y = new int;
*x = 3;
*y = 4;
x  = y;
delete x;

是的,这可能是内存泄漏。在将
y
分配给
x
之前,通过
delete
-ing
x
可以避免内存泄漏。然后,由于
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不希望在注释中回答,而是在回答框中回答。