小编Mik*_*eyG的帖子

复制构造函数和赋值运算符实现选择 -

我最近重新访问了复制构造函数,赋值运算符,这里看到的复制交换idom: 什么是复制和交换习惯用法? 和许多其他地方 -

上面的链接是一个很好的帖子 - 但我还有一些问题 - 这些问题可以在很多地方,stackoverflow和许多其他网站上得到解答,但我没有看到很多一致性 -

1 - 您是否应该try- catch在我们为复制构造函数中的深层复制分配新内存的区域周围?(我已经看到了两种方式)

2 - 关于复制构造函数和赋值运算符的继承,何时应该调用基类函数,何时这些函数应该是虚函数?

3 - std::copy复制构造函数中复制内存的最佳方法是什么?我已经看过了memcpy,看到其他人说memcpy世界上最糟糕的事情.


考虑以下示例(感谢所有反馈),它提示了一些其他问题:

4 - 我们应该检查自我分配吗?如果是这样的话

5 - 关闭主题问题,但我看到swapped用作: std::copy(Other.Data,Other.Data + size,Data); 应该是: std::copy(Other.Data,Other.Data + (size-1),Data); 如果swap从'First到Last'而第0个元素是Other.Data?

6 - 为什么注释掉的构造函数不起作用(我必须将大小更改为mysize) - 假设这意味着无论我编写它们的顺序如何,构造函数将始终首先调用分配元素?

7 - 对我的实施还有其他评论吗?我知道代码没用,但我只想说明一点.

class TBar
{

    public:

    //Swap Function        
    void swap(TBar &One, TBar &Two)
    {
            std::swap(One.b,Two.b);
            std::swap(One.a,Two.a);
    }

    int a;
    int *b;


    TBar& operator=(TBar Other)
    {
            swap(Other,*this);
            return (*this);
    }

    TBar() : …
Run Code Online (Sandbox Code Playgroud)

c++ inheritance constructor deep-copy assignment-operator

6
推荐指数
1
解决办法
1597
查看次数

4级继承链中的C++ Virtual Destructors.

我正在做虚拟析构函数的一个小实验来审查 - 想知道是否有人对以下内容有一个简单的解释(使用vs 2010):

我定义类层次结构ABCD,D继承C,C继承B,B继承A,A是Base;

跑了2个实验:

第一个实验 -

A有一个虚拟的析构函数.

B有一个非虚拟析构函数

C有一个虚拟的析构函数

D有一个非虚拟的析构函数

// ----------------------------

在D类型的堆上分配4个对象 - 在第3个点指向A*,B*和C*的指针 - 将第4个作为完整性的D*.删除所有4个指针.

正如我所料,在所有4个实例中,完整的析构函数链以相反的顺序从D向下执行到A,从而释放所有内存.

第二次实验 -

A具有非虚拟析构函数**将A更改为非虚拟

B有一个非虚拟析构函数

C有一个虚拟的析构函数

D有一个非虚拟的Distructor

在D类型的堆上分配4个对象 - 在前3个点指向A*,B*和C*的指针 - 将第4个作为完整性的D*.

删除C*和D*指针:完整的析构函数链以从D向下到A的相反顺序执行,释放所有内存.

删除B*:B然后运行析构函数(泄漏)

删除A*:只运行析构函数(泄漏)

任何人都可以解释为什么这是?

当在实验2中分配D类型opject时,它的直接基类(C)有一个虚拟析构函数 - 不能告诉编译器用Vptr跟踪它并知道内存类型?无论参考?

谢谢迈克

c++ virtual-destructor

3
推荐指数
1
解决办法
1531
查看次数