如果我不释放/删除动态分配的数组会发生什么?

Ste*_*ski 3 c++ class object dynamic-allocation

这段代码不是我写的!在类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 ;
}
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*Jon 6

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

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

而且wp=tmp,这意味着什么,wp只是动态的新名称,所以它适合类中的名称,但内存中的位置仍然相同?要么?

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

据推测,还有其他成员函数WebServer可以读取内部的值wp并使用它们执行操作.

总的来说,你应该知道这段代码编写得非常糟糕,因为它甚至不是远程异常安全的,它可以通过一个相当聪明的实现来避免工作,最重要的是它使用的是自制代码而不是标准语言设施如std::vector.


Alo*_*ave 5

你得到:

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

在这种情况下,它只会导致内存泄漏.但是,根据是否为其他对象重用相同的未分配内存,可能会导致未定义的行为.

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

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