模板类c中的析构函数:如何删除可能是指针或不是指针的字段?

Destructor in template class c : How to delete field which may be pointer or not pointer?

本文关键字:指针 字段 删除 析构函数 何删除      更新时间:2023-10-16

>我有模板类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)。

在析构函数中,您可以使用std::is_pointer并且只能delete[]数据。

首选的替代方法是不要自己管理内存(使用std::vector或智能指针)。

您可以为模板开发两个版本。首先,编写普通版本template<class T>。然后,编写第二个仅指针版本,通过像这样声明模板来专门化您的模板:

template<class T>
class TArray<T*>

如果将原始指针替换为std::unique_ptrstd::shared_ptr,问题就会消失。

(如果这不是你想要的,那么请三思而后行,考虑TArray是否应该管理它。谁将保证存储在TArray<T*>中的指针已分配new?这个问题没有 RAII 解决方案。