我有模板类Array
,其中模板类型T
应该是指针类型或非指针类型。
template<class T>
class TArray
{
static const int max_len=100;
T* data;
int length;
public:
TArray(){data=new T[max_len]; this->length=0;}
void Add(T value){data[length++]=value;}
~TArray();
};
问题是如何释放空间,因为我们无法调用delete
这样的非指针类型
template<class T>
TArray<T>::~TArray()
{
//for(int i =0; i < length; i++)
// delete data[i]; // NOT WORKING WITH OBJECTS THAT ARE NOT POINTERS !!!
delete[] data;
}
让我们有额外的课程
class A
{
int* a;
public:
A(int n){a = new int[n];}
~A(){delete[] a;}
};
并创建两个模板类实例
// Create array of doubles
TArray<double>* double_array = new TArray<double>();
delete double_array;
// Create array of pointers to class A
TArray<A*>* A_array = new TArray<A*>();
A* a = new A(5);
A_array->Add(a);
delete A_array;
当我为TArray<A*>
调用析构函数时,我需要为类A
调用析构函数但我不知道如何,因为析构函数中的注释代码不是编译(C2541),如果我们为例做的双打数组。
答案 0 :(得分:5)
在析构函数中,您可以使用std::is_pointer
,然后只使用delete[]
数据。
首选的替代方法是不要自己管理内存(使用std::vector
或智能指针)。
答案 1 :(得分:3)
您可以为模板开发两个版本。首先,编写正常版本template<class T>
。然后,通过声明如下来编写专门化模板的第二个仅指针版本:
template<class T>
class TArray<T*>
答案 2 :(得分:2)
如果用std::unique_ptr
或std::shared_ptr
替换原始指针,问题就会消失。
(如果这不是你想要的,那么请考虑TArray
是否应该管理这个。谁将保证TArray<T*>
中存储的指针已经分配了{{1} }?该问题没有RAII解决方案。)