C++ class public 函数 returns 一个指针但不允许删除该指针?

C++ class public function that returns a pointer but doesn't allow deleting that pointer?

template<typename T>
class SmartBuffer {
    int capacity;
    MyArray<T> *data;

public:

    SmartBuffer() {
        capacity = 0;
        data = nullptr;
    }

    void alloc(int nbElements) {            
        if (nbElements > capacity) {
            cout << "Allocating smart buffer\n";
            if (data!=nullptr) delete data;
            data = new MyArray<T>(nbElements + 1);
            capacity = nbElements + 1;                
        }
    }

    int size() {
        return capacity;
    }

    MyArray<T>* getBuffer() const {
        return data;
    }

    MyArray<T>* getBuffer() {
        return data;
    }
};

基本上,这个class用于数据的预分配,因为new[]delete[](以及cudaMalloccudaFree)很慢并在我的问题中占据了 运行 时间的很大一部分。

所以,我希望return一个指向MyArray对象的指针,调用者可以自由修改对象。但绝对不能删除数据。基本上,只有 SmartBuffer 对象可以删除它自己的数据。

除了使用另一个包装器 class 并像下面那样删除删除运算符之外,还有其他方法可以在 C++ 中执行此操作吗?

void operator delete (void *p) = delete;

自然的解决方案是将 MyArray 的析构函数声明为 private 并在其定义中添加 friend class SmartBuffer<T> 以仅允许 SmartBuffer 删除它。

然而,正如您在评论中所述,您在不同的上下文中使用 MyArray 并希望它“正常”运行。你为什么不实现另一种类型。最省力的方法是创建一个用于 SmartBuffer:

的继承“包装器”
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>;
};

然后你去:

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