我必须自己从头开始构建一个动态数组类,我也尝试用一个(set like)函数来扩展它,将新元素添加到数组中,它编译得很好,但程序崩溃,因为它有一些记忆泄漏。
请尽量帮助我,我在学校的通知时间很短。
数组类
template <class T>
class Array
{
int n; /// size
T* data;
public:
explicit Array(int n): n(n) { adat=new T[n]; }
Array(const Array&);
Array& operator=(const Array&);
~Array();
T& operator[](int idx) { return data[idx]; }
int size() { return n; }
int lookfor(T);
void add(T);
void del();
};
template <class T>
Array<T>::Array(const Array<T>& t)
{
n=t.n;
data=new T[n];
for (int idx=0; idx<n; ++idx)
data[idx]=t.data[idx];
}
/**
Operator=
*/
template <class T>
Array<T>& Array<T>::operator=(const Array<T>& t)
{
if (this==&t) return *this;
delete[] data;
n=t.n;
data=new T[n];
for (int idx = 0; idx < n; ++idx)
data[idx]=t.data[idx];
return *this;
}
/**
dtor
*/
template <class T>
Array<T>::~Array()
{
del();
}
template <class T>
int Array<T>::lookfor(T el)
{
for(int idx = 0; idx < n; ++idx)
if(data[idx] == el)
return idx;
return -1;
}
/**
add
*/
template <class T>
void Array<T>::add(T el)
{
if(lookfor(elem) != -1)
{
T* temp = new T[n + 1];
for (int idx = 0; idx < n; ++idx)
temp[idx]=data[idx];
temp[n + 1] = el;
del();
data = temp;
++n;
}
}
template <class T>
void Array<T>::del()
{
for(int idx = 0; idx < n; ++idx)
delete data[idx];
delete[] data;
}
失败的代码:
Control ctrl;
ctrl.add(new Room());
ctrl.add(new Room());
Control和Room都是数组的子类。喜欢Control:publicArray&lt;房间*&gt;
答案 0 :(得分:2)
删除del()
中删除所有data[idx]
元素的循环。 data
不是指针数组,它是T
类型的值数组,因此您无法删除它们。即使您创建了一个指针数组,这些指针也会从调用方传递到add
,并且它们由程序的该部分所有,而不是Array
类。在向数组添加元素时,您也不想删除所有旧指针,因为新的data
数组仍然包含这些指针。
对使用delete
创建的内容调用new
会导致未定义的行为,这可能会导致您的崩溃。