程序_free_dbg(块,_UNKNOWN_block)出错

Error for a program _free_dbg(block, _UNKNOWN_BLOCK)

本文关键字:UNKNOWN block 出错 free dbg 程序      更新时间:2023-10-16

这是一本书中的问题,我得到了以下错误:_free_dbg(块,_UNKNOWN_block(

下面是一个类的实现代码:

template<class T>
Set<T>::Set(): items(NULL), num_items(0)
{
}
template<class T>
Set<T>::Set(const Set<T>& other)
{
num_items = other.num_items;
items = other.to_array();
}
template<class T>
Set<T>::~Set()
{
if (items != NULL)
{
delete[] items;
}
}
template<class T>
void Set<T>::operator= (const Set<T>& right_side)
{
if (items != NULL)
{
delete[] items;
}
num_items = right_side.num_items;
items = right_side.to_array();
}
template<class T>
void Set<T>::add(T item)
{
if (!contains(item))
{
T *new_items = new T[num_items + 1];
for (int i = 0; i < num_items; i++)
{
new_items[i] = items[i];
}
new_items[num_items] = item;
if (num_items > 0)
{
delete[] items;
}
num_items++;
items = new_items;
}
}
template<class T>
void Set<T>::remove(T item)
{
if (contains(item))
{
T *copy = NULL;
if (num_items > 1)
{
copy = new T[num_items - 1];
for (int i = 0, j = 0; i < num_items; i++)
{
if (items[i] != item)
{
copy[j] = items[i];
j++;
}
}
}
delete[] items;
items = copy;
num_items--;
}
}
template<class T>
int Set<T>::size() const
{
return num_items;
}
template<class T>
bool Set<T>::contains(T item) const
{
for (int i = 0; i < num_items; i++)
{
if (items[i] == item)
{
return true;
}
}
}
template<class T>
T *Set<T>::to_array() const
{
T *copy = NULL;
if (num_items > 0)
{
copy = new T[num_items];
for (int i = 0; i < num_items; i++)
{
copy[i] = items[i];
}
return copy;
}
}

我查了一下这个问题,我相信是删除[]部分导致了这个问题。有人能告诉我错误是什么吗?我该如何纠正?

好的,我已经解决了这个问题。

Set.cpp中的contains功能替换为:

template<class T>
bool Set<T>::contains(T item) const
{
for (int i = 0; i < num_items; i++)
{
if (items[i] == item)
{
return true;
}
}
return false;
}

然后将main.cpp中的print_set函数替换为:

template<class T> 
void output_set(Set<T> myset) 
{ 
T *ptr = myset.to_array(); 
if (ptr != NULL) 
{ 
for (int i = 0; i < myset.size(); i++) {
cout << ptr[i] << endl;  } 
}
else { 
cout << "The set is empty." << endl;
} 
} 

解释

contains函数中,当未找到item时,您忘记返回false。这意味着在这种情况下,该函数没有返回任何值,当您在if语句的Set中添加一个项以检查是否有项时调用该函数时,此操作失败。

现在,对于print_set函数,即使您没有完成打印,您也会在循环中每次删除ptr,因此第一个项目打印正确,但其余项目没有。

相关文章: