模板类c中的析构函数:如何删除可能是指针或不是指针的字段?
Destructor in template class c : How to delete field which may be pointer or not pointer?
>我有模板类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_ptr
或std::shared_ptr
,问题就会消失。
(如果这不是你想要的,那么请三思而后行,考虑TArray
是否应该管理它。谁将保证存储在TArray<T*>
中的指针已分配new
?这个问题没有 RAII 解决方案。
相关文章:
- 更改保留指向其字段的原始指针的对象地址
- 指向结构中的数组的指针,其中每个字段都是一个动态数组
- 将指向结构的指针转换为具有较少字段数的另一种结构类型
- 如何使用指向该数组的指针访问结构数组中包含的结构中的字段?[C++]
- C++ 通过指针更改 char* 类字段
- 是否会自动删除已添加到重复字段的指针
- 通过另一个对象C++的字段中的指针访问对象
- 结构字段上的智能指针
- 模板类c中的析构函数:如何删除可能是指针或不是指针的字段?
- 如果超构造函数不使用派生类字段,是否可以将该指针传递给该指针?
- C++:为智能指针的字段隐式保留右值引用
- 类指针字段,类型为变量(有点)
- 在指针指向指针字段的场景中访问值,每个指针都指向 int
- 使用指向成员的指针读取 cons 对象的字段的值
- 如何将指向基类的指针保存到另一个类的字段
- 在C++类中使用指针作为成员字段是不是很傻
- 使用此指针指向类中的位字段
- 是否声明抽象类型的字段?首选指针或引用
- SCDynamicStoreContext的函数指针字段是用来干什么的?
- 释放c++映射值中的指针字段的问题