首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么使用'new‘会导致内存泄漏?

为什么使用'new‘会导致内存泄漏?
EN

Stack Overflow用户
提问于 2012-01-13 02:01:58
回答 5查看 25.9K关注 0票数 133

我首先学习了C#,现在我从C++开始。据我所知,C++中的运算符new与C#中的运算符不同。

你能解释一下这个示例代码中内存泄漏的原因吗?

代码语言:javascript
复制
class A { ... };
struct B { ... };

A *object1 = new A();
B object2 = *(new B());
EN

回答 5

Stack Overflow用户

发布于 2012-01-13 05:09:20

代码语言:javascript
复制
B object2 = *(new B());

这条线是泄漏的原因。让我们把这个拆分一下..

object2是一个B类型的变量,存储在地址1(是的,我在这里选择任意的数字)。在右边,你请求一个新的B,或者一个指向B类型对象的指针。程序很乐意给你这个,并将你的新B赋值给地址2,还在地址3中创建了一个指针。现在,访问地址2中数据的唯一方法是通过地址3中的指针。接下来,使用*解除对指针的引用,以获得指针所指向的数据(地址2中的数据)。这将有效地创建该数据的副本,并将其分配给地址1中分配的object2。请记住,它是副本,而不是原始数据。

现在,问题来了:

实际上,您从未将该指针存储在任何您可以使用它的地方!一旦这个赋值完成,指针(你用来访问address2的address3中的内存)就超出了你的作用域并且超出了你的能力范围!您不能再对它调用delete,因此不能清除address2中的内存。剩下的是address1中来自address2的数据的一个副本。两个相同的东西存在于记忆中。一个是您可以访问的,另一个是您不能访问的(因为您丢失了它的路径)。这就是为什么这是一个内存泄漏。

我建议你从你的C#背景出发,阅读大量关于C++中指针是如何工作的知识。它们是一个高级主题,可能需要一些时间才能掌握,但它们的使用对您来说将是无价的。

票数 9
EN

Stack Overflow用户

发布于 2012-02-08 21:38:17

如果这能让事情变得更简单,那么可以把计算机内存想象成一家酒店,而程序就是客户,他们会在需要的时候租用房间。

这家旅馆的运作方式是,你订一间房,然后告诉行李员你什么时候离开。

如果你预定了一个房间,没有告诉行李员就离开了,行李员会认为这个房间还在使用,不会让其他人使用它。在这种情况下,有一个房间漏水。

如果你的程序分配内存而不删除它(它只是停止使用它),那么计算机就认为内存仍在使用中,不允许其他任何人使用它。这是一个内存泄漏。

这不是一个确切的类比,但它可能会有所帮助。

票数 8
EN

Stack Overflow用户

发布于 2012-01-13 02:05:15

在创建object2时,您正在创建使用new创建的对象的副本,但是您也丢失了(从未分配的)指针(因此以后无法删除它)。为了避免这种情况,您必须将object2作为引用。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8839943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档