我首先学习了C#,现在我从C++开始。据我所知,C++中的运算符new
与C#中的运算符不同。
你能解释一下这个示例代码中内存泄漏的原因吗?
class A { ... };
struct B { ... };
A *object1 = new A();
B object2 = *(new B());
发布于 2012-01-13 05:09:20
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++中指针是如何工作的知识。它们是一个高级主题,可能需要一些时间才能掌握,但它们的使用对您来说将是无价的。
发布于 2012-02-08 21:38:17
如果这能让事情变得更简单,那么可以把计算机内存想象成一家酒店,而程序就是客户,他们会在需要的时候租用房间。
这家旅馆的运作方式是,你订一间房,然后告诉行李员你什么时候离开。
如果你预定了一个房间,没有告诉行李员就离开了,行李员会认为这个房间还在使用,不会让其他人使用它。在这种情况下,有一个房间漏水。
如果你的程序分配内存而不删除它(它只是停止使用它),那么计算机就认为内存仍在使用中,不允许其他任何人使用它。这是一个内存泄漏。
这不是一个确切的类比,但它可能会有所帮助。
发布于 2012-01-13 02:05:15
在创建object2
时,您正在创建使用new创建的对象的副本,但是您也丢失了(从未分配的)指针(因此以后无法删除它)。为了避免这种情况,您必须将object2
作为引用。
https://stackoverflow.com/questions/8839943
复制相似问题