class A
{
public:
A(int i)
{
x = new int(i);
}
~A()
{
if (x != NULL)
{
delete x;
x = NULL;
}
}
private:
A();
int *x;
};
void f()
{
{
map<int,A> myMap;
A a(2);
// myMap[7] = a; // cannot access default ctor
pair<int, A> p(7,a);
myMap.insert(p);
}
}
这里的问题是,在范围退出时,A的析构函数被调用两次。可能是第一次破坏A a(2)
,第二次破坏map创建的临时对象。由于未分配x
,因此会导致异常。
myMap[7] = a
会构造一个新的A
,为什么使用默认的ctor?答案 0 :(得分:1)
因为下标运算符返回对映射中元素的引用,然后将该元素分配给该元素。为了具有要引用和分配给该对象的对象,必须构造该元素(除非给定键的元素已经碰巧存在)。
a。为避免复制,请:emplace
将A
直接复制到地图中,而不是复制局部变量。
b。尽管摆脱不必要的副本是一件好事,但它不能替代固定的课程。使类在分配和复制后具有明确定义的行为,或者使该类不可复制和不可分配。有关更多信息,请参见三(五)规则。
您绝对不应拥有裸露的指针。相反,使用唯一的指针将以一种优雅的方式修复该类。