Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;类公共函数,该函数返回指针但不';不允许删除该指针?_C++_Class_Pointers_Delete Operator - Fatal编程技术网

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;
}