【发布时间】:2012-06-14 19:33:38
【问题描述】:
我有这个简单的代码(为了简化,重要的部分可能只有构造函数和 add 方法。)(代码更新)。
#include "general.h"
template <class T>
class Template
{
private:
T* oldArr;
T* newArr;
int oldArrTop;
int oldArrLen;
public:
Template();
~Template();
void add(const T& val);
void print();
};
template <class T>
Template<T>::Template()
{
oldArr=new T[2];
oldArrTop=0;
oldArrLen=2;
newArr=new T[4];
//newArr's length is always 2.
}
template <class T>
Template<T>::~Template()
{
delete[] oldArr;
delete[] newArr;
}
template <class T>
void Template<T>::add(const T& val)
{
//add normally
oldArr[oldArrTop]=val;
//need to copy 2 elements
if( oldArrTop%2==1 )
{
newArr[oldArrTop]=oldArr[oldArrTop];
newArr[oldArrTop-1]=oldArr[oldArrTop-1];
}
oldArrTop++;
//need to double array's size
if( oldArrTop==oldArrLen )
{
delete[] oldArr;
oldArr=newArr;
oldArrLen*=2;
newArr=new T[oldArrLen*2];
}
}
template <class T>
void Template<T>::print()
{
for (int i=0; i<oldArrTop; i++)
cout<<oldArr[i]<<endl;
}
这是使用模板的代码:
Template<int> a=Template<int>();
for(int i=0;i<10;i++)
a.add(i);
a.print();
但是,当我使用带有整数的模板时(例如),我第一次删除数组时(第一次进入 add 中的“需要加倍数组的大小”部分时,我得到一个堆损坏错误。任何人都知道问题是什么? 非常感谢!
我不确定是什么修复了它,但是堆损坏错误消失了。但是,它不是打印从 0 到 9 的数字,而是打印一个奇怪的数字 (-842105421)。任何想法为什么?
【问题讨论】:
-
我相信 delete[] oldArr;只是删除指向数组中第一个元素的指针。您必须遍历并删除数组中的每个单独元素
-
@timkd127 除非他将其设为指针数组,否则这是不必要的。 @Idan:您是否尝试过将
oldArrTop++移出作业?也许你的编译器有一个奇怪的顺序 -
你能贴出使用这个的代码吗?
-
你违反了the rule of three。
-
尝试在每次添加后打印对象,看看结果如何,您应该能够通过自己逐步执行逻辑来弄清楚发生了什么
标签: c++ memory-management