C++ C++;类公共函数,该函数返回指针但不';不允许删除该指针?
自然的解决方案是将C++ C++;类公共函数,该函数返回指针但不';不允许删除该指针?,c++,class,pointers,delete-operator,C++,Class,Pointers,Delete Operator,自然的解决方案是将MyArray的析构函数声明为private,并将friend class SmartBuffer添加到其定义中,以仅允许SmartBuffer删除它 但是,正如您在评论中所述,您在不同的上下文中使用了MyArray,希望它“正常”运行。为什么不实现另一种类型呢。最简单的方法是创建一个用于SmartBuffer的继承“包装器”: void operator delete (void *p) = delete; 模板类SmartBuffer//转发声明(必须在“朋友”之前) 模
MyArray
的析构函数声明为private
,并将friend class SmartBuffer
添加到其定义中,以仅允许SmartBuffer
删除它
但是,正如您在评论中所述,您在不同的上下文中使用了MyArray
,希望它“正常”运行。为什么不实现另一种类型呢。最简单的方法是创建一个用于SmartBuffer
的继承“包装器”:
void operator delete (void *p) = delete;
模板类SmartBuffer//转发声明(必须在“朋友”之前)
模板
类MySmartArray:public MyArray
{
private:~MySmartArray(){}
private:MySmartArray(){}//也不允许外部使用构造函数
朋友类智能缓冲区;
};
然后你去:
template <typename T> class SmartBuffer; //forward declaration (necessary before 'friend')
template <typename T>
class MySmartArray : public MyArray<T>
{
private: ~MySmartArray() {}
private: MySmartArray() {} //disallow also the constructor from external usage
friend class SmartBuffer<T>;
};
模板
类智能缓冲区{
国际能力;
MySmartArray*数据;
公众:
~SmartBuffer{delete data;}//SmartBuffer可以删除MySmartArray
//并将无处不在的MyArray替换为MySmartArray。。。
//...
};
现在外部用户将无法删除它:
template<typename T>
class SmartBuffer {
int capacity;
MySmartArray<T> *data;
public:
~SmartBuffer { delete data; } //SmartBuffer can delete MySmartArray
//and replace everywhere MyArray to MySmartArray ...
//...
};
intmain()
{
智能缓冲buff;
auto ptr=buff.getBuffer();
删除ptr;//错误:“MySmartArray::~MySmartArray()[with T=int]”在此上下文中是私有的
返回0;
}
侧注:如果(数据!=nullptr)删除数据,则无需在中测试nullptr
,因为在nullptr
指针上调用delete
总是安全的。如果函数返回原始(非void
)指针,从技术上讲,除了不可访问的析构函数外,没有任何东西可以阻止调用者在delete
表达式中使用该指针。滥用该指针会导致未定义的行为。通常,这是通过文档来处理的(即,文档化的函数返回一个不应释放的指针,调用方必须遵循文档化的规则)。在包装类中使用运算符delete()
并不是一个解决方案-类运算符delete()
是作为delete
表达式机制的一部分调用的函数。@prapin O.O出于某种原因,我总是记得出于某种原因“deleting nullptr=bad”。可能来自java@bloody通常这就足够了。不幸的是,MyArray在其他地方正常使用(没有SmartBuffer)。@Peter听起来像答案:\n你能写出来吗?
template<typename T>
class SmartBuffer {
int capacity;
MySmartArray<T> *data;
public:
~SmartBuffer { delete data; } //SmartBuffer can delete MySmartArray
//and replace everywhere MyArray to MySmartArray ...
//...
};
int main()
{
SmartBuffer<int> buff;
auto ptr = buff.getBuffer();
delete ptr; // error: 'MySmartArray<T>::~MySmartArray() [with T = int]' is private within this context
return 0;
}