C++ 在C+中删除模板+;当列表<;列表<;X>&燃气轮机;
我正在尝试开发一个带有模板的通用列表。这个列表由一个指针数组T*组成,T*是一个整数,用于获取元素数和一些方法(find、contains…)重要的是,我不能使用std::library 例如,当我使用C++ 在C+中删除模板+;当列表<;列表<;X>&燃气轮机;,c++,list,templates,generics,delete-operator,C++,List,Templates,Generics,Delete Operator,我正在尝试开发一个带有模板的通用列表。这个列表由一个指针数组T*组成,T*是一个整数,用于获取元素数和一些方法(find、contains…)重要的是,我不能使用std::library 例如,当我使用列表时,我的问题就出现了 其中一种方法是调整T*指针数组的大小,因此当我有这个列表>时,我会创建一个比T*大的auxpointer,并使用memcpy将T内容复制到auxpointer。内部指针(list.T.T)也作为指针复制,而不是内存复制,因此当我删除T*指针并重新设计T=auxpointe
列表时,我的问题就出现了
其中一种方法是调整T*
指针数组的大小,因此当我有这个列表>
时,我会创建一个比T*
大的auxpointer,并使用memcpy
将T
内容复制到auxpointer。内部指针(list.T.T
)也作为指针复制,而不是内存复制,因此当我删除T*
指针并重新设计T=auxpointer
时。我已经在我的新T
中丢失了该指针的数据
template <typename T>
void CGenericList<T>::resize()
{
T* auxPointer = new T[this->maxElements*2];
memcpy (auxPointer,this->pointer,this->maxElements*sizeof(T));
delete[] this->pointer;
this->pointer=auxPointer;
this->maxElements=2*this->maxElements;
}
template<class T>
class CGenericList
{
public:
T* pointer;
int N;
int maxElements;
CGenericList();
CGenericList(int);
~CGenericList();
void resize();
}
模板
void CGenericList::resize()
{
T*auxPointer=newt[this->maxElements*2];
memcpy(auxPointer,this->pointer,this->maxElements*sizeof(T));
删除[]这个->指针;
此->指针=auxPointer;
this->maxElements=2*this->maxElements;
}
模板
类CGenericList
{
公众:
T*指针;
int N;
整数最大元素;
CGenericList();
CGenericList(int);
~CGenericList();
void resize();
}
有人能给我一些做这件事的建议吗 您的调整大小
不是异常安全的。首先删除现有阵列,然后为不同大小分配内存,然后分配auxPointer。
对于您遇到的问题,请检查以下方法是否有帮助
T* auxPointer = new T[this->maxElements*2];
for ( int i =0; i < this->maxElements; ++i)
std::swap(auxPointer[i], pointer[i]);
delete[] this->pointer;
this->pointer = auxPointer;
this->maxElements=2*this->maxElements;
T*auxPointer=newt[this->maxElements*2];
对于(int i=0;imaxElements;++i)
交换(auxPointer[i],指针[i]);
删除[]这个->指针;
此->指针=auxPointer;
this->maxElements=2*this->maxElements;
您的调整大小
不是异常安全的。首先删除现有阵列,然后为不同大小分配内存,然后分配auxPointer。
对于您遇到的问题,请检查以下方法是否有帮助
T* auxPointer = new T[this->maxElements*2];
for ( int i =0; i < this->maxElements; ++i)
std::swap(auxPointer[i], pointer[i]);
delete[] this->pointer;
this->pointer = auxPointer;
this->maxElements=2*this->maxElements;
T*auxPointer=newt[this->maxElements*2];
对于(int i=0;imaxElements;++i)
交换(auxPointer[i],指针[i]);
删除[]这个->指针;
此->指针=auxPointer;
this->maxElements=2*this->maxElements;
您发布的代码显示了一些问题
T* auxPointer = new T[this->maxElements*2];
这里分配一个新的maxElements数组*2-并调用默认构造函数。
在您的情况下,可能会初始化所有列表元素
memcpy (auxPointer,this->pointer,this->maxElements*sizeof(T));
然后,将旧数组的内容复制到新分配内存的内存区域。这将使用旧数组->内存泄漏中的指针覆盖指向刚创建的ListElement的指针
delete[] this->pointer;
然后删除数组,这将调用所有元素的析构函数。
希望能删除他们的内容,释放他们的记忆
this->pointer=auxPointer;
最后,重新分配新创建的数组。列表中的指针指向旧的listselements,并指向不再分配的内存(因为通过delete[]调用析构函数)
一个解决方案是为列表实现一个复制构造函数,并为所有人调用它
数组中的元素。(DeepCopy)当然还有一个作业操作员,我差点忘了;)
cgenericslist(const cgenericslist©);
CGenericList和运算符=(常量CGenericList和rhs)
可能是这样的——请注意这是“asis”,绝对不例外;)
模板
类CGenericList
{
公众:
T*指针;
int N;
整数最大元素;
CGenericList();
CGenericList(const CGenericList和副本);
CGenericList和运算符=(常量CGenericList和rhs);
CGenericList(int);
~CGenericList();
void resize();
};
模板
void CGenericList::resize()
{
T*auxPointer=新建T[this->maxElements*2];
对于(inti=0;imaxElements;i++)
{
auxPointer[i]=此->指针[i];
}
删除[]这个->指针;
此->指针=auxPointer;
this->maxElements=this->maxElements*2;
}
模板
CGenericList::CGenericList()
:N(0)
,maxElements(0)
{
此->指针=新的T[1];
}
模板
CGenericList::CGenericList(常量CGenericList和副本)
:N(复印件编号)
,maxElements(copy.maxElements)
{
T*temp=新的T[copy.maxElements];
对于(int i=0;ipointer=temp;
}
模板
CGenericList和CGenericList::运算符=(常量CGenericList和rhs)
{
如果(此!=&rhs)
{
删除[]这个->指针;
这个->指针=新的T[rhs.maxElements];
for(inti=0;ipointer[i]=rhs.pointer[i];
}
}
归还*这个;
}
模板
CGenericList::CGenericList(整数大小)
:N(0)
,最大元素(大小)
{
此->指针=新的T[大小];
}
模板
CGenericList::~CGenericList()
{
删除[]这个->指针;
}
int main(int/*argc*/,char*/*argv*/[])
{
CGenericList列表;
list.resize();
返回0;
}
如果你不喜欢使用stl,你可以看看你发布的代码显示了一些问题
T* auxPointer = new T[this->maxElements*2];
这里分配一个新的maxElements数组*2-并调用默认构造函数。
在您的情况下,可能会初始化所有列表元素
memcpy (auxPointer,this->pointer,this->maxElements*sizeof(T));
然后,将旧数组的内容复制到新分配内存的内存区域。这将用旧数组->内存泄漏中的指针覆盖指向刚创建的ListElement的指针
delete[] this->pointer;
然后删除数组,这将调用所有元素的析构函数。
希望能删除他们的内容,释放他们的记忆
this->pointer=auxPointer;
最后重新分配新创建的数组。列表中的指针指向旧的listselements并指向不再分配的内存(因为通过delete[]调用析构函数)
一个解决方案是为列表实现一个复制构造函数,并为所有人调用它
数组中的元素。(DeepCopy)当然还有赋值运算符,我差点忘了;)