繁体   English   中英

为什么在副本分配ctor的末尾没有释放所获取的资源?

[英]Why isn't the acquired resource released at the end of this copy assignment ctor?

我正在阅读C ++编程语言第4版,并且到达了有关复制分配构造函数的部分。 作者有一个名为Vector的类,他这样定义了副本分配构造函数

Vector& Vector::operator=(const Vector& a)
{
   double* p = new double[a.sz];
   for (int i=0; i != a.sz; ++i)
      p[i] = a.elem[i];
   delete[] elem;
   elem = p;
   sz = a.sz;
   return *this
}

(对于那些拥有这本书的人,可以在第74页上找到。)现在,我的问题是:如果p具有新资源,为什么在返回之前不通过删除将其发布? 或用另一种方式说:为什么缺少delete [] p不能视为内存泄漏?

我之所以这样问,是因为到目前为止,我已经注意到每个新文件都必须有一个删除,并且我看到的问题“我应该在这里使用删除 ”表明每个新文件都应该有一个删除。 我看到了这个问题是否必须始终在new之后跟随删除? 但是在那种情况下,程序结束并且资源被释放了,而在上面的代码中程序继续了。

(此外,在另一个问题上,elem = p语句会调用复制分配构造函数吗?此行使我感到困惑,因为它似乎会调用它并执行某种无限循环)

通常的模式是,如果类拥有资源,则其析构函数将释放该资源(请参阅RAII )。 因此,毫无疑问,

Vector::~Vector()
{
    delete[] elem;
}

别处。

在对象生命周期的各个阶段,其他操作可能会释放资源,例如,在这种情况下为副本分配构造函数。 如果完成此操作,则资源将被仔细地重新分配,或者将其设置为指示没有任何要释放的状态(例如,将其设置为nullptr )。


关于第二个问题。 Vector的副本分配运算符只是在为指针分配一个新值- 涉及递归。

对于每个要执行的new ,应该在要执行的某处delete 它不一定必须具有相同的功能。 此外,在程序文本中出现一次delete可能会与多次出现new匹配,反之亦然。 执行次数必须匹配,而不是文本匹配。

elem = p不会调用任何东西。 elemp是指针。 这是内置的类型分配。

您担心的delete将在这种情况的destructor中完成。

代码正在做的是为数据创建空间,复制数据并释放旧内存。 留下新的内存供以后处理, RAII

旁注:

 elem = p

它不会调用class复制操作,因为它们是指向POD(普通旧数据类型)的指针

您正确地分配了p而没有随后的delete[]调用是正确的; 但是,正如您还观察到的那样, p指向的内存也由elem指向:

double* p = new double[a.sz]; // allocate memory
delete[] elem; // delete the old memory
elem = p; // point to the new memory allocated

正如其他人指出的那样, elem在析构函数中被删除。

没有复制构造函数调用,因为没有复制:指针elem只是在更改它指向的位置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM