C++ C+中指针成员初始化的最佳实践+;98
假设我们有以下非常简单的类:C++ C+中指针成员初始化的最佳实践+;98,c++,pointers,constructor,c++98,C++,Pointers,Constructor,C++98,假设我们有以下非常简单的类: class Item { public: Item(){}; virtual ~Item(){}; }; 类ItemHolder,它保存一个指向Item实例的指针。我希望ItemHolder只保存一个指向实际数据的指针,而不在内部复制任何内容。因此,我想这就是ItemHolder应该是什么样子: class ItemHolder { public: ItemHolder(){ Q = NULL; } I
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
或复制构造函数创建其他变量的任何副本)是否有参考成员?这取决于项目持有人
和项目
之间的预期关系及其各自的生命周期。候选:std::shared_ptr
,std::unique_ptr
当然还有参考成员(当物品持有者与物品的生命周期无关时)。如果你不想对储存时间负责(也不想使用智能指针),我会通过指针:物品持有者(物品*QQ)
。很明显,两个持有者持有相同的项目,而其中一个是通过复制构造函数从otherpimpl习惯用法创建的@BaummitAugen我不认为推荐成员会起作用,因为他们必须指出一些东西。。。