指针成员初始化C ++ 98中的最佳实践

时间:2015-07-09 13:44:55

标签: c++ pointers constructor c++98

假设我们有以下非常简单的类:

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或复制构造函数创建其他变量的任何副本)?

0 个答案:

没有答案