【发布时间】:2013-12-30 03:34:47
【问题描述】:
我有一个类,我将其称为 myclass,它有一个类型为 T 的列表容器。我还有几个从列表中删除项目的方法。如果 T 是某种指针,我想检查它是否确实是一个指针,然后将其删除,以便将分配的资源释放回内存。这是一段sn-p代码:
template<typename T>
class myclass{
private:
std::list<T> * container;
// other vars
public:
void erase(const T &item){
if (!this->find(item)) // find is defined elsewhere
return false;
auto temp = container->begin();
for (int i = 0; i < container->size(); ++i){
// this is where i would like to check if *temp is a pointer,
// so that I can assign it to a pointer var, remove it from the list,
// then delete the pointer,
//otherwise just simply remove it from the list.
}
}
};
编辑
auto temp = container->begin();
我想知道如何确定 *temp 是否是一个指针,以便我可以执行以下操作:
T * var = *temp;
container->remove(temp); // remove or erase, i can't recall at the moment
delete var;
但我只想在 *temp 是指针的情况下这样做
【问题讨论】:
-
我建议只让用户做 myclass<:unique_ptr>> 而不是指针 - 当用户想要释放原始指针时,你现在真的不需要,而智能指针将自行释放
-
std::is_pointer?会这样使用吗:
if (std::is_pointer(pointer))? -
std::is_pointer<>是一个模板 type 条件。 IE。std::is_pointer<T>::value,无论如何,我对此持大部分意见;这样做并不完全正确。 -
关于您的编辑:
*temp是一个指针当且仅当T是一个指针类型。在*temp和T是指针类型的情况下,T*将是指向指针类型的指针,而T* var = *temp行将导致编译错误。你应该做delete *temp。但是请注意,即使*temp是一个指针,也不能保证它指向已分配的内存,delete可能会导致错误。
标签: c++ templates pointers containers