gpt4 book ai didi

c++ - 将智能指针引入遗留项目

转载 作者:搜寻专家 更新时间:2023-10-31 01:20:42 24 4
gpt4 key购买 nike

我正在更改一些遗留代码,以便使用智能指针。

我们的项目早于 boost,因此我们有一个现有的侵入式智能指针类(API 见下文)。

我想为这些类型删除对 delete 的显式调用,那么找到它们的最佳方法是什么?

例如:

class A : public RefCount // RefCount added to manage lifetime
{
// ...
};
// typedef A * APtr; => Previous implementation
typedef SPtr<A> APtr;

void deleteObjects (APtr a)
{
delete a; // Want to find this (ideally with compile error)
}

与智能指针一起使用的所有类型都派生自一个保持引用计数的基类,当计数为零时,该类应负责删除对象。

我已经将我今天所做的添加为 answer ,但是,该方法不适用于在层次结构中删除的调用。我正在寻找一个完整的解决方案来捕获任何明确的删除调用(来自 RefCount 成员的调用除外)。

智能指针类有以下成员:

template <typename B>
class SPtr
{
public:
// Ctor
SPtr () throw ();
SPtr (B * b) throw ();
SPtr (const SPtr & bptr) throw ();

// Copy Asgn
SPtr & operator = (B * b);
SPtr & operator = (const SPtr & bptr);

// Dtor
~SPtr () throw ();


// Access
bool isSet () const;

B * pointer () const;
B * operator -> () const;
B & operator * () const;
operator void const * () const;
};

最佳答案

创建模板类的析构函数 SPtr私有(private)的。这将导致错误调用 delete a;其中 a 的类型为 SPtr<T>其中 T 是任意类型。

另一个解决方案是重载 deletedelete[]运营商,并将其设为私有(private)。在那种情况下,您仍然可以在堆栈上创建类,但调用删除会导致错误。例如:

class MyClass {
private:
void operator delete(void *p);
void operator delete[](void *p);
};

关于c++ - 将智能指针引入遗留项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4510312/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com