请参阅 TC++PL 第 3 版第 10.4.4.1 "copying object" 节
refer to section 10.4.4.1 "copying object" of TC++PL 3rd edition
class table{
name *p; int i;
public:
table(int j=15){p=new name[i=j]} //constructor
~table(){delete[]p;}
}
void h()
{
table t1;
table t2=t1;
table t3;
t3=t2;
}`
Bjarne为t1
创建的数组将被删除3次,因为为t1
创建的数组出现在t1
、t2
、t3
**中
你能用其他例子解释一下这是什么意思吗。
如果复制构造函数和运算符=只复制指针的值,那么最终t1、t2和t3将具有指向相同内存位的指针。若表有一个删除指针的析构函数,那么同一指针将被删除三次——每个对象一次。这应该会导致segfault。
为了防止这种情况,类可以为每个副本分配一个新数组(称为生成深度副本),或者进行引用计数。
相关文章:
- 当覆盖存在时调用基本虚拟"binded to object"函数
- "Unable to start debugging. No process is associated with this object." - 在Visual Studio Code中使用GDB
- C++将派生类转换为基类时'object slicing'期间发生的情况
- 如何理解 C++17 标准参考中的 [intro.object]/3? N4659 的
- "Cannot convert Python object argument to type '<typename>'" - 使用 Cython 包装 C++ 类时出错
- 使用 object 中的方法调用带有 std::bind 和 std::function.target 的 C 样式函数
- "Called Object Type is Not a Function or Pointer" 与 typedef 和类
- C++线程"Call to non-static member function without an object argument"
- dopen():不以 root 身份运行时"failed to map segment from shared object"
- 当两个成员位于同一类中时出错"a nonstatic member reference must be relative to a specific object"
- Nan::ObjectWrap to Napi::Object Wrap 无法访问 JavaScript 中的属性
- 现代C++会支持 C# "Object Initalizer"语法吗?
- 指向对象生存期之外的已分配内存的指针是"invalid pointer[s]"还是"pointer[s] to an object"?
- C++ Equivalent of Java Map<String, Object>
- WebKit2GTK+ "window-object-cleared"未清除
- 返回 *&object 时是否允许复制/移动省略?
- QPointer::clear() 是删除其引用的指针,还是"Clears this QPointer object."其他含义?
- 解决方法:'can not be used when making a shared object; recompile with -fPIC'使用Cmake。使用普通的 g++ 工作
- 根据标准,究竟什么是"declaration of an object"
- 请参阅 TC++PL 第 3 版第 10.4.4.1 "copying object" 节