我是编码的新手,所以如果这个问题看起来很愚蠢,请原谅我。我正在编写自己的List类,以更好地了解List的结构,但是遇到了一个问题。当我向列表中添加更多项时,我就动态地分配了列表,并且程序中的解构函数与int配合良好。但是,当我用std :: string测试时,我遇到了一个问题。在我的解构函数被调用之后,它会不断抛出异常(即使(我相当确定)我删除了我单独分配的内存,而不是删除了它们的内存(违反读取访问权限)。
我尝试使用智能指针而不是在解构器中删除分配的内存,但是最终还是遇到了同样的问题。从网上看,我似乎只能找到“仅用解构函数删除”和“在解构函数中没有异常处理”。两者都不是我写的东西。
首先,这是(在我看来)解决此问题的相关代码。
#include <string>
#include <iostream>
using std::cout;
using std::cin;
using std::string;
template <class type>
class List
{
struct Node
{
type data;
Node* next;
};
public:
List();
~List();
void addToList(type var);
private:
Node head;
Node *last, *lastAcc;
unsigned int length, prevPos;
};
template <class type>
List<type>::~List()
{
Node *prevPtr;
lastAcc = head.next;
while (lastAcc->next) // While the next pointer leads to something
{
// Go to that something, and delete the item you were on
prevPtr = lastAcc;
lastAcc = lastAcc->next;
delete prevPtr;
}
delete lastAcc;
}
template <class type>
void List<type>::addToList(type var)
{
if (length)
{
last->next = new Node;
last = last->next;
last->data = var;
}
else
{
head.data = var;
}
lastAcc = last;
prevPos = length++;
}
template <class type>
List<type>::List()
{
head.next = 0;
prevPos = 0;
lastAcc = last = &head;
length = 0;
}
int main()
{
string boi[] = { "Today is a good day", "I had an apple", "It tasted delicious" };
List<string> multiString;
for (int i = 0; i < 3; i++)
{
multiString.addToList(boi[i]);
}
return 0;
}
我希望代码能够正常运行,并且如果我出错了,我认为该错误将显示在我的代码上。不在std :: string上。任何帮助将不胜感激。
[编辑]在附加的注释上,[lastAcc]缩写为最后一次访问;这只是我实现的目的,它使遍历列表的速度快于每次都不必从0开始。 [prevPos]显示[lastAcc]在列表中的位置。让我知道您是否需要看更多我的代码或解释什么〜!
答案 0 :(得分:1)
您不会在addToList
中初始化last-> next,因此析构函数中的迭代不在列表末尾。正确的代码是:
void List<type>::addToList(type var)
{
if (length)
{
last->next = new Node();
last = last->next;
last->data = var;
}
else
{
head.data = var;
}
lastAcc = last;
prevPos = length++;
}
区别是new Node()
而不是new Node
。第一个值初始化POD类型,第二个不初始化。
或者,如果您为Node定义了一个构造函数,那么new Node
和new Node()
将是等效的:
struct Node
{
Node(): next( 0 ) {}
type data;
Node* next;
};
要获得小幅效率,您可以将值转移到节点中以防止复制:
struct Node
{
Node(): next( 0 ) {}
Node(type && data): data( std::move( data ) ), next( 0 ) {}
type data;
Node* next;
};
template <typename T>
void addToList(T&& var)
{
if (length)
{
last->next = new Node(std::move(var));
last = last->next;
}
else
{
head.data = std::move(var);
}
lastAcc = last;
prevPos = length++;
}