C++ 在C+中删除模板+;当列表<;列表<;X>&燃气轮机;

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*是一个整数,用于获取元素数和一些方法(find、contains…)重要的是,我不能使用std::library

例如,当我使用
列表时,我的问题就出现了

其中一种方法是调整
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)当然还有赋值运算符,我差点忘了;)