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[]
(以及cudaMalloc
和cudaFree
)很慢并在我的问题中占据了 运行 时间的很大一部分。
所以,我希望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;
}
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[]
(以及cudaMalloc
和cudaFree
)很慢并在我的问题中占据了 运行 时间的很大一部分。
所以,我希望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;
}