【问题标题】:invoking copy constructor inside other constructor在其他构造函数中调用复制构造函数
【发布时间】:2012-03-19 10:50:39
【问题描述】:
#include <stdlib.h>
#include <iostream>
#include <vector>
#include <string>
class A
{
public:
    std::string s;
    A()
    {
        s = "string";
        new(this)A(*this);
    }
};
int main()
{
    A a;
    std::cout<<a.s;
    return 0;
}

我在输出中得到空字符串。 C++ 标准对此类行为有何规定?

【问题讨论】:

  • 噢,我现在真的需要喝咖啡。
  • 我在 GCC 4.5 的输出中得到了“字符串”
  • 这是:new(this)A(*this);invoking copy constructor inside other constructor?
  • stdlib.h => cstdlib 但无论如何这里都不需要标题。

标签: c++ placement-new


【解决方案1】:

这里至少有两个问题:

  • 您尝试使用自身的副本初始化 A
  • 在构造函数内部,A 尚未完全构造,因此您无法真正复制它

更不用说new(this) 本身就是可疑的。

【讨论】:

  • new(this) 很好。并且通常也可以保证使用自身的副本分配给某物(复制分配运算符需要防止自分配) - 另一方面,复制构造是另一回事。
  • @Konrad:所以默认(生成的)复制 ctor 防止自分配,因此不执行实际复制?似乎中间变量 A a(*this);新的(这个)(一);解决“问题”?
  • @user396672 没有这种情况。默认的复制赋值操作符防止自赋值。我不认为默认的复制构造函数会这样做,只是因为这种情况通常不会发生。
【解决方案2】:

您这样做是连续两次调用s 的构造函数,因此,行为未定义(并且很可能某些内存已泄漏)。

【讨论】:

    猜你喜欢
    • 2018-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-13
    • 2017-04-01
    • 1970-01-01
    • 2017-02-08
    • 1970-01-01
    相关资源
    最近更新 更多