问题标签 [rule-of-three]

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.

0 投票
7 回答
301 浏览

c++ - 复制堆栈变量时出现异常的析构函数行为

我写了一个测试来检查在堆栈变量上覆盖赋值之前是否调用了析构函数,但我找不到任何合理的结果解释......

这是我的测试(在 Visual C++ 2008 发布模式下):

如果我的假设是正确的,我希望得到“abcd”,如果错误,我期望得到“d”。相反,我得到“bcdx”。“x”根据分配给 ptr 的内存量而变化,表明它正在读取随机堆值。

我相信正在发生的事情(如果我错了,请纠正我)是每个构造函数调用都会创建一个新的堆栈值(让我们称它们为 s1、s2、s3、s4),然后分配让 s1.ptr 被 s4.ptr 覆盖. 然后 s4 在复制后立即被销毁,但 s1(带有悬空的 ptr)在离开范围时被销毁,导致 s4.ptr 的双重删除,而原始 s1.ptr 没有删除。

有什么办法可以解决不涉及使用 shared_ptrs 的这种无益行为?

编辑:将“删除”替换为“删除 []”

0 投票
3 回答
1670 浏览

c++ - 在 STL 向量中存储对象 - 最小的方法集

什么是复杂对象(具有显式分配的内部数据)的“最小框架”(必要方法),我想将其存储在 STL 容器中,例如<vector>

对于我的假设(复杂对象 Doit 的示例):

在 valgrind 中:

更新:

此类对象的最小方法是:(基于 sbi 答案)

谢谢,sbi,https: //stackoverflow.com/users/140719/sbi

0 投票
5 回答
16970 浏览

c++ - C++ 复制构造函数 + 指针对象

我正在尝试在 C++ 中学习“三巨头”。我设法为“三巨头”做了非常简单的程序。但我不确定如何使用对象指针。以下是我的第一次尝试。

我在写这篇文章的时候有一个疑问...

问题

  1. 这是实现默认构造函数的正确方法吗?我不确定我是否需要拥有它。但是我在另一个关于带有指针的复制构造函数的线程中发现的是,在复制构造函数中的地址之前,我需要为该指针分配空间。
  2. 如何在复制构造函数中分配指针变量?我在 Copy Constructor 中写的方式可能是错误的。
  3. 我是否需要为复制构造函数和 operator= 实现相同的代码(除了 return )?
  4. 我说我需要删除析构函数中的指针是否正确?

    /li>

执行

提前致谢。

0 投票
8 回答
331242 浏览

c++ - 什么是三法则?

  • 复制对象是什么意思?
  • 什么是复制构造函数复制赋值运算符
  • 我什么时候需要自己申报?
  • 如何防止我的对象被复制?
0 投票
5 回答
329 浏览

c++ - 在 C++ 中分配时,我们分配的对象会被破坏吗?

以下代码片段是否泄漏?如果没有,在 foobar() 中构造的两个对象在哪里被破坏?

0 投票
9 回答
75180 浏览

c++ - C++11 的三规则变成五规则?

因此,在观看了关于右值引用的精彩讲座后,我认为每个类都会受益于这样的“移动构造函数”、template<class T> MyClass(T&& other) 编辑,当然还有“移动赋值运算符”,template<class T> MyClass& operator=(T&& other)正如 Philipp 在他的回答中指出的那样,如果它是动态分配的成员,或通常存储指针。就像如果前面提到的要点适用,你应该有一个复制ctor、赋值运算符和析构函数。想法?

0 投票
3 回答
165 浏览

c++ - c++继承问题

我对此有一个问题:

能告诉我为什么main编译的最后一行吗?我传递了一个intintoB的构造函数,它需要一个A对象。我相信 theint被翻译成AinB的构造函数,但为什么呢?

提前致谢。

艾薇儿

0 投票
1 回答
221 浏览

c++ - 谁能给我一个如何在 C++ 中正确使用“三巨头”的例子?

可能的重复:
什么是三法则?

嗨,我一直在阅读有关该主题的内容,许多网站都告诉我为什么需要 ctor、copy ctor 和 dtor。但是我很难找到如何使用它们的好例子。此外,我真的不明白为什么我们需要将参数作为 const 传递给复制 ctor。任何帮助,将不胜感激!

0 投票
3 回答
2166 浏览

c++ - 安全分配和复制和交换习语

我正在学习 c++,我最近学习了(在堆栈溢出中)关于复制和交换习语的知识,我对此有一些疑问。因此,假设我有以下类使用复制和交换习语,例如:

我的问题是,假设我有另一个类,它有一个 Foo 对象作为数据但没有指针或其他可能需要自定义复制或分配的资源:

现在我有一系列问题:

  1. 上面为Bar类实现的方法和构造函数是否安全?使用了复制和交换来Foo确保在分配或复制时不会造成任何伤害Bar

  2. 在复制构造函数和交换中通过引用传递参数是强制性的吗?

  3. 是否可以说,当 的参数operator=按值传递时,为此参数调用复制构造函数以生成对象的临时副本,然后与该副本交换*this?如果我通过引用传递,operator=我会有一个大问题,对吧?

  4. 是否存在这种习语无法在复制和分配时提供完全安全的情况Foo

0 投票
4 回答
588 浏览

c++ - 为什么在三规则中不考虑非默认构造函数?

三法则(也称为三巨头法则或三巨头法则)是 C++ 中的一条经验法则,它声称如果一个类定义了以下其中之一,它可能应该显式定义所有三者:析构函数、复制构造函数、复制赋值运算符。

为什么非默认构造函数不被视为其中之一?当类中管理任何资源时,程序员无论如何都必须定义一个非默认构造函数。