正在取消分配数组中的项
Deallocating item in array
如果有一个对象,让我们称它为o
,还有两个数组typeo *a,*b;
如果我将o
分配给数组a
和数组b
,那么delete[] b
如果我尝试在中访问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?
如果只定义inta[1]
,则不在堆中分配内存,因此无需删除。
否则,如果按以下方式创建数组:CCD_ 8,您必须删除为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
的析构函数释放了该资源,则会留下一个悬空副本。
为了避免这些问题,通常建议将所有类设计为具有值语义。如果类对不可重复的资源有一个句柄,则该类应禁用其复制构造函数和赋值运算符,以防止不必要的复制。事实上,资源句柄应该由为资源句柄设计的类持有。
这有时被称为"三规则"(或自C++11以来,"五规则"或"零规则")。
相关文章:
- 在c++中为我自己的基于指针的数组分配内存的正确方法
- 具有自定义构造函数 (C++) 的类型的动态数组分配
- 如何通过 malloc 为队列数组分配内存?
- 具有动态数组分配的OpenMP嵌套循环
- 如何为数组结构的数组分配内存
- 如何为结构数组分配内存?
- cpp 数组 - 分配常量索引有效,而非常量索引不起作用
- 如何为字符指针数组分配内存?
- 在 C++ 中初始化后的数组分配
- 将数据分配给了数组分配,但程序显示了以缓冲区超支的输出
- C++函数问题中的数组分配
- 子数组分配:使用聚合对象错误的预期"{...}"进行初始化
- 为什么我的指针数组分配不起作用
- std::堆栈和堆栈溢出错误的数组分配
- 在 c++ 中是否有通过声明"implicit"数组分配?
- 在 c++ 中为 2-D "Dynamically Created"数组分配值时遇到问题
- 如何为C++数组分配指向第一个元素的指针
- 字符数组分配
- 将数组分配在固定数量的线程之间
- 为构造函数中的数组分配值