取消分配数组中的项目

Deallocating item in array

它如果有一个对象,我们称它为 o,如果我将 o 分配给数组 a 和数组 [=15=,则称它为两个数组 typeo *a,*b; ] 然后 delete[] b 如果我尝试访问 a 中的 o 或 o 会发生什么?例如:

struct name{int a;}
name *a = new name[1];
name *b = new name[1];
name o;
a[0] = o;
b[0] = o;
delete[] b;
a[0]; // what happens here?

如果你只是定义 int a[1] 你不是在堆中分配内存,所以不需要 delete。

否则如果你创建一个数组如下: int *a= new int[1] , 你必须删除为 delete [] a;

考虑到以上两种情况,如果您为 b 和 a 分配了内存,则可以在删除 b 后安全地访问 `a'。

示例中没有问题。 a[0]b[0]是不同内存位置的不同对象,销毁其中一个对另一个没有影响。

new 是一条红鲱鱼;以下代码的工作方式相同:

name o;
name a = o;
{
   name b = o;
}

a;

name 具有 值语义 ,也就是说,按值复制它会创建一个完全不同的副本。 int 等内置类型也都具有值语义。

如果 o 没有值语义,此代码只会 运行 出问题;例如,如果它包含资源句柄但不包含用于复制资源句柄的复制构造函数和赋值运算符代码。

然后复制 o 会使两个对象在该资源上具有相同的句柄,如果 o 的析构函数释放资源,它将留下悬空副本。

为避免这些问题,通常建议将所有 classes 设计为具有值语义。如果 class 对不可复制的资源具有句柄,则 class 应禁用其复制构造函数和赋值运算符以防止无意复制。事实上,资源句柄应该由为资源句柄设计的class持有。

这有时被称为 "rule of three"(或者从 C++11 开始,"rule of five" 或 "rule of zero")。