假设我们有以下非常简单的类:
class Item {
public:
Item(){};
virtual ~Item(){};
};
和类ItemHolder
,它包含指向Item
实例的指针。我希望ItemHolder
只保存指向实际数据的指针,而不是在内部复制任何内容。因此,我想这就是ItemHolder
应该是这样的:
class ItemHolder {
public:
ItemHolder(){
Q = NULL;
}
ItemHolder(Item &QQ){
Q = &QQ;
}
virtual ~ItemHolder() {
// Don't delete Q!
// The caller is responsible for the fate of Q...
}
private:
Item *Q;
};
但是,我猜这种设计受到某些病毒的影响,在C ++ 11中使用智能指针处理这些病症。例如,可以预期以下代码也会删除a
,但事实并非如此:
Item *a = new Item();
ItemHolder *q = new ItemHolder(*a);
delete q;
更重要的是,我经常遇到以下构造函数模式:
ItemHolder(const Item &QQ){
Q = new Item(QQ);
}
伴随着这样的析构函数:
virtual ~ItemHolder() {
if (Q != NULL){
delete Q;
Q = NULL;
}
}
所有这些可能(并且将会)产生关于谁负责各种对象的内存管理的模糊性。在C ++ 98中实例化指针时常用的最佳实践是什么(假设我不想使用new
或复制构造函数创建其他变量的任何副本)?