void Mixture::Append(Pure_substance& x)//添加纯物质对象x {/*在此补充本段代码,如果x是一种新成分,就扩大堆区数组,加入新组成物质,并变更组成的种类数目;否则只需要更变原组成物质的质量。15分*/ int i, n = Find(x); if (n == -1) { Pure_substance* p = new Pure_substance[num + 1]; for (i = 0; i < num; i++) p[i] = ps[i]; p[num] = x; if (ps) delete[]ps; ps = p; num++; } else { ps[n].quality += x.quality; } }请问这段代码有什么问题
时间: 2024-03-16 16:44:02 浏览: 8
这段代码中存在潜在的内存泄漏问题。在 `if (n == -1)` 分支中,如果 `new` 操作失败,会导致 `p` 指向一个 `NULL` 指针,而 `ps` 指向原来的内存块,这样会导致 `ps` 指向的内存块无法释放,从而造成内存泄漏。
为了避免这个问题,应该在 `new` 操作失败时,先释放掉 `ps` 指向的内存块,再将 `ps` 指向 `NULL`。
改正后的代码如下:
```
void Mixture::Append(Pure_substance& x) {
int i, n = Find(x);
if (n == -1) {
Pure_substance* p = new Pure_substance[num + 1];
if (!p) { // new 操作失败
delete[] ps;
ps = NULL;
cerr << "Error: memory allocation failed" << endl;
return;
}
for (i = 0; i < num; i++)
p[i] = ps[i];
p[num] = x;
delete[] ps;
ps = p;
num++;
}
else {
ps[n].quality += x.quality;
}
}
```