这段代码不是我写的! 在类WebServer中,我们重载+ =运算符。该类使用动态分配的WebPage类型的对象数组(另一个类,组合)定义为WebPage * wp;
WebServer & operator +=( WebPage webPage ) {
WebPage * tmp = new WebPage [ count + 1];
for (int i = 0; i < count ; i ++)
tmp [i] = wp[i];
tmp [ count ++] = webPage ;
delete [] wp;
wp = tmp;
return * this ;
}
因此,我们为一个对象创建一个具有额外空间的动态分配WebPages的新数组,然后我们为它们分配wp所持有的值,然后为我们想要添加到数组的对象。因此,如果我删除delete[] wp;
,程序仍然正常。那么如果我删除那行代码会发生什么?而且wp = tmp,这是什么意思,wp只是动态的新名称,所以它适合类中的名称,但内存中的位置仍然相同?或?
答案 0 :(得分:6)
所以如果我删除delete [] wp;该程序仍然可以正常工作。所以呢 如果我删除那行代码会发生什么?
您已经介绍了memory leak。每次调用此运算符时,该进程都会浪费其地址空间的一部分,直到它最终耗尽内存。
而且
wp=tmp
,这意味着什么,wp只是一个新名称 动态,因此它适合类中的名称,但位置 在记忆中还是一样吗?或?
wp
可能是WebServer
的成员(实例变量),它包含它所服务的WebPage
个对象的实例。因此,该行正在用新值替换以前的网页数组(包括刚添加到服务器的网页)。
据推测,WebServer
还有其他成员函数可以读取wp
中的值并使用它们执行操作。
总的来说,你应该知道这段代码编写得非常糟糕,因为它甚至不是远程异常安全的,它可以通过相当聪明的实现来避免工作,最重要的是它使用自制代码代替标准语言设施,如std::vector
。
答案 1 :(得分:5)
你得到:
在这种情况下,它只会导致内存泄漏。但是,根据是否为其他对象重用相同的未分配内存,可能会导致未定义的行为。
C ++ 11标准:[basic.life](3.8对象生命周期),第4段:
程序可以通过重用对象占用的存储或通过使用非平凡的析构函数显式调用类类型的对象的析构函数来结束任何对象的生命周期。对于具有非平凡析构函数的类类型的对象,程序不需要在重用或释放对象占用的存储之前显式调用析构函数;但是,如果没有对析构函数的显式调用,或者如果没有使用delete-expression(5.3.5)来释放存储,则不应该隐式调用析构函数,并且依赖于生成的副作用的任何程序都会生成析构函数具有未定义的行为。
答案 2 :(得分:2)
不调用delete意味着不会调用free
并且不会调用析构函数。不在分配的内存上调用free
的含义是内存泄漏 - 您的程序不再可以使用该内存。如果这种情况持续存在,那么随着时间的推移你的程序很可能崩溃,因为内存不足,不调用dtor的含义意味着你的数组使用的任何其他资源(更多内存,数据库连接,等)也输了。
答案 3 :(得分:2)
如果您不删除某些内容,则会出现内存泄漏。内存泄漏是在“它保持工作很长一段时间,但后来失败”类别的破坏代码。这使得它们难以处理,因为问题在原始错误发生很长时间后发生,并且通常很难确定内存泄漏的位置/方式,并且当没有更多内存时应用程序在某个“随机”位置失败可用。
当应用程序泄漏内存时,对其他应用程序也不好,因为其他应用程序可用的内存较少。
根据泄漏的规模,最终可能会导致您的应用程序因可靠性而声名狼借(“它在两天后崩溃”),或者它可能最终成为您的应用程序的杀手(“当我尝试使用更复杂的用例时不起作用”)。或者可能只是经过两年的连续使用后,应用程序的内存使用量已经增加到64MB到72MB,因为在整个方案中,泄漏是如此微小,你并没有真正注意到。
但是内存泄漏永远不是一件好事,而且在很多情况下都是一件非常糟糕的事情。
答案 4 :(得分:0)
使用new
分配的对象将保留在堆上,直到它们被delete
取消分配。如果你不删除它们,它们将保留在那里(但不会被访问 - &gt;这称为内存泄漏),直到你的进程退出,然后操作系统将解除分配它们。
答案 5 :(得分:0)
这可能是一个糟糕的代码,但我不知道使用字符串和向量(idk因为他们没有教我们的原因),但我仍然不太明白。是WebPage * tmp = new WebPage [ count + 1];
我们占据新空间的拳头,然后我们传输数据,然后我们删除wp。那么wp = tmp;
做了什么。它是否仅将名称wp赋予tmp占用的空间,以便它对应于类中的名称,但这些对象的地址与tmp使用的地址相同,但与删除前使用的wp不同?
类似的东西: