问题标签 [copy-and-swap]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 使用复制和交换习语,复制对象的析构函数如何不取消分配指向内存?
我正在阅读以下问题:
我的印象是,当一个对象按值传递时,它的指针和值被复制,但传递的对象指针指向的内存没有被复制。因此,当从链接到示例中重载赋值运算符时:
...复制对象的析构函数如何不消除指向的资源,mArray
?现在正在完成分配的对象是否没有一个mArray
指向可能已释放内存的复制指针?该行是否swap(first.mArray, second.mArray);
分配新内存并复制前一个数组的内容?
c++ - 为什么 SGI STL 不使用复制和交换习语?
我最近在 StackOverflow 上阅读了关于What is the copy-and-swap idiom 的答案?并且知道复制和交换习语可以
避免代码重复,并提供强大的异常保证。
但是,当我查看 SGI STL deque
implementation时,我发现它没有使用成语。我想知道为什么不,如果成语在某种程度上像“最佳实践”?
c++ - When to use std::swap for stream types?
Trying to give an answer to this question text-file-handling-in-c giving references to cplusplus.com. I came across to the std::swap
-function for stream-types like fstream
.
So my question is: What exactly is the purpose of a swap functionality e.g. for a 'fstream' respectively in which situation do I have to use it?
Referencing to to the Q&A C++ std::ifstream in constructor problem I know that stream types are non-copyable. Referencing to the Q&A What is the copy-and-swap idiom? the swap-functionality is e.g. given to implement a copy-constructor,... . So are stream-types having the swapping
-feature now copyable with the swap
-feature -> If so, how do the language-developers achieved it?
c++ - 使用swap实现移动赋值
我发生了一些事情,我认为这是完全合理的,但我希望人们对此发表意见,以防我完全错过了一些东西。所以首先,我的理解T& operator=(T&& rhs)
是,当我们完成时,我们并不关心内容rhs
是什么,只是内容已经被移入this
并且rhs
可以安全地破坏。
话虽如此,复制赋值运算符的常见异常安全实现,假设交换很便宜,看起来像这样:
所以实现移动赋值运算符的一种自然方式是这样的:
但后来我突然想到,rhs
不一定是空的!那么,为什么不做一个 plainswap
呢?
我认为这满足了移动分配操作员需要做的事情......但就像我说的,这只是发生在我身上,所以我认为我可能遗漏了一些东西。
我能想到的唯一“缺点”是,this
与执行移动构造/交换的版本相比,使用普通交换拥有的东西可能会活得更长。
想法?
c++ - 具有私有数据成员的抽象类的交换习语
假设我们有这两个类,并实现了交换习语。基类的复制构造函数和赋值运算符被删除,因为它没有意义。然而,交换方法被实现,因为它拥有一个成员。
正如在许多示例中所看到的,这将是我认为的标准方法。但是,我发现公共 Base::swap 存在问题,因为不能只交换抽象基类!
删除 Base 类的模板并保护 Base::swap 方法不是更好吗:
假设有另一个从基类派生的类,第一个实现可以交换 ID,但是派生对象的数据成员将保持不变。
那么,我是否正确地认为从外部交换抽象类是不可能的?
c++ - 为什么 std::vector 有两个赋值运算符?
自 2011 年以来,我们既有复制任务,也有移动任务。然而,这个答案非常有说服力地证明,对于资源管理类,只需要一个赋值运算符。例如std::vector
,这看起来像
这里重要的一点是,论点是按价值衡量的。这意味着在输入函数体的那一刻,大部分工作已经通过构造函数完成other
(如果可能,通过移动构造函数,否则通过复制构造函数)。因此,这会自动正确地实现复制和移动分配。
如果这是正确的,为什么(至少根据本文档)std::vector
没有以这种方式实现?
编辑以解释这是如何工作的。other
考虑以下示例中上述代码中发生的情况
c++ - 重置对象
最近我经常通过用operator=
. 我的大多数课程都有一个copy constructor
并operator=
使用“复制和交换”习语定义。在大多数情况下都可以正常工作,尽管效率不高,但这并不重要。但是有一种情况是行不通的。它什么时候destructor
需要constructor
在新对象之前调用。
注意:我使用它的大多数类都是不可复制的
然后我教过可能重写operator=
以首先手动调用destructor
然后执行swap
(在这种情况下rhs
将由 const 引用)。然而,stackOverflow 上的这个答案让我不这么认为。
我真的很喜欢 operator= 来重置我的对象,因为代码很干净并且与内置类型(如 int)相同。它还使用 和 的代码constructor
,destructor
因此不需要编写和维护额外的代码。
所以我的问题是:有没有办法实现我的目标,用干净的代码重置我的对象,无需编写额外的代码,并在构造新对象之前销毁对象?
c++ - 在复制和交换习语中实现交换
在What is the copy and swap idiom和How to provide a swap function for my class之后,我尝试像在后者接受的答案选项 2 (具有调用成员函数的自由函数)中那样实现交换函数,而不是直接友好前一个链接中的免费功能。
但是以下内容无法编译
我知道复制和交换习语在这里有点过分,但它也允许人们通过复制构造函数 (1) 对内部状态实施一些约束(一个更具体的例子是保持一个简化形式的分数)。不幸的是,这不能编译,因为编译器看到的 (2) 的唯一候选者是 Bar::swap 成员函数。我是否坚持使用朋友非成员函数方法?
编辑:转到我下面的答案,看看我最终得到了什么,这要感谢关于这个问题的所有答案和评论。
c++ - 交换和复制习语不能在抽象类中使用
当我尝试在抽象类中使用复制和交换习语时遇到了一个有趣的错误。下面的代码是专门为了演示这种情况而创建的,如果有什么不妥的地方,告诉我但不要关注:
错误信息是:
显然是这条线导致了这个错误,所以我必须在派生类而不是在这里声明它,还是有任何其他高级技术?