3

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

4

3 回答 3

5

在析构函数内部,您只能使用std::is_pointer数据delete[]

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

于 2012-10-22T15:09:23.177 回答
3

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

template<class T>
class TArray<T*>
于 2012-10-22T15:09:57.747 回答
2

如果用std::unique_ptror替换原始指针std::shared_ptr,问题就会消失。

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

于 2012-10-22T15:08:54.980 回答