c++ - 模板类 c 中的析构函数 : How to delete field which may be pointer or not pointer?

标签 c++ templates destructor

我有模板类 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 调用析构函数但我不知道怎么做,因为如果我们制作 double 组,则析构函数中的注释代码无法编译 (C2541)。

最佳答案

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

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

关于c++ - 模板类 c 中的析构函数 : How to delete field which may be pointer or not pointer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13014286/

相关文章:

c++ - 返回 char** 或传递 char* 数组

asp.net - 动态更改 GridView 项模板

templates - 如何更新 Go 模板中的字段值

c++ - 从奇怪的模板类型转换

c++ - 复制堆栈变量时异常的析构函数行为

c++ - 停止 Windows Mobile 6.5 选项卡重新排序

各种类型指针的 C++ 容器

c++ - 抛出未处理的异常后过早离开的析构函数是否会释放成员数据?

c++ - 构造函数中的异常

c++ - 通过引用 std::inner_product 传递迭代器