4

这段代码不是我写的!在 WebServer 类中,我们重载了 +=operator。该类使用动态分配的 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 ;
}

因此,我们为一个对象创建了一个新的动态分配的 WebPage 数组,并为一个对象分配了额外的空间,然后我们为它们分配了 wp 保存的值,然后是我们想要添加到数组中的对象。因此,如果我删除delete[] wp;该程序仍然可以正常工作。那么如果我删除那行代码会发生什么?还有wp = tmp,这是什么意思,wp只是一个动态的新名称,所以它适合类中的名称,但内存中的位置仍然相同?或者?

4

6 回答 6

7

所以如果我删除 delete[] wp; 该程序仍然可以正常工作。那么如果我删除那行代码会发生什么?

您引入了内存泄漏。每次调用此运算符时,该进程都会浪费其地址空间的一部分,直到最终耗尽内存。

而且wp=tmp,这意味着什么, wp 只是动态的一个新名称,因此它适合类中的名称,但内存中的位置仍然相同?或者?

wp大概是一个成员(一个实例变量),WebServer它保存了WebPage它所服务的对象的实例。因此,该行正在用新值(包括刚刚添加到服务器的网页)替换以前的网页数组。

大概还有其他成员函数WebServer读取里面的值wp并用它们做事。

作为一般说明,您应该知道这段代码编写得非常糟糕,因为它甚至不是远程异常安全的,它正在做的工作可以通过合理的更智能的实现来避免,而且最重要的是它使用自制代码而不是标准语言设施如std::vector

于 2013-08-28T11:30:53.080 回答
5

要么你得到:

  • 只是内存泄漏或
  • 具有未定义行为的内存泄漏取决于您的类的析构函数是否具有具有副作用的代码。

在这种情况下,它只会导致内存泄漏。但是,取决于相同的未分配内存是否被其他对象重用,您最终可能会出现未定义的行为。

C++11 标准:[basic.life](3.8 对象生命周期),第 4 段:

程序可以通过重用对象占用的存储空间或通过显式调用具有非平凡析构函数的类类型对象的析构函数来结束任何对象的生命周期。对于具有非平凡析构函数的类类型的对象,在重用或释放对象占用的存储空间之前,程序不需要显式调用析构函数;但是,如果没有显式调用析构函数,或者如果没有使用删除表达式 (5.3.5) 来释放存储,则不应隐式调用析构函数,并且任何依赖于析构函数产生的副作用的程序具有未定义的行为。

于 2013-08-28T11:31:07.013 回答
2

如果您不删除某些内容,则会发生内存泄漏。内存泄漏属于“它持续工作了很长一段时间,但随后失败”的损坏代码类别。这使得它们难以处理,因为问题发生在原始错误之后很长时间,并且通常很难确定内存泄漏的位置/方式,并且当没有更多内存时,应用程序在某个“随机”位置失败可用的。

当应用程序泄漏内存时,对其他应用程序也是不利的,因为其他应用程序可用的内存将减少。

根据泄漏的规模,它可能最终成为导致您的应用程序在可靠性方面声誉不佳的原因之一(“两天后崩溃”),或者最终成为您应用程序的杀手(“Doesn当我尝试更复杂的用例时不起作用”)。或者可能只是在连续使用两年后,该应用程序的内存使用量从 64MB 增加到 72MB,因为在整个方案中,泄漏是如此之小,你并没有真正注意到。

但是内存泄漏从来都不是一件好事,而且在很多情况下是一件非常糟糕的事情。

于 2013-08-28T11:39:33.673 回答
2

不调用 delete 意味着不调用free并且不调用析构函数。不调用分配的内存的含义free是内存泄漏——您的程序不再可以使用该内存。如果这种情况持续存在,随着时间的推移,您的程序很可能会因为内存不足而崩溃,不调用 dtor 意味着您的数组使用的任何其他资源(更多内存、数据库连接)也会丢失。

于 2013-08-28T11:37:01.770 回答
0

用 分配的对象new会一直停留在堆上,直到用 释放delete。如果您不删除它们,它们将保留在那里(但将无法访问-> 这称为内存泄漏),直到您的进程退出,此时操作系统将释放它们。

于 2013-08-28T11:32:01.483 回答
0

这可能是一个糟糕的代码,但我不知道使用字符串和向量(idk 他们没有教我们的原因),但我还是不太明白。是不是,WebPage * tmp = new WebPage [ count + 1];我们先占用新空间,然后我们传输数据,然后我们删除wp。那么做什么呢wp = tmp;。是不是只给 tmp 占用的空间取名 wp 以便与类中的名称相对应,但是那些对象的地址与 tmp 使用的相同,但与 wp 被删除前使用的不同? 在此处输入图像描述 就像是:

于 2013-08-29T09:55:51.977 回答