我最近重新访问了复制构造函数,赋值运算符,这里看到的复制交换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) 我正在做虚拟析构函数的一个小实验来审查 - 想知道是否有人对以下内容有一个简单的解释(使用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跟踪它并知道内存类型?无论参考?
谢谢迈克