调用类解构函数时,std::string 会抛出错误
When Class deconstructor is called, std::string throws an error
我是编码新手,所以如果这个问题看起来很愚蠢,请原谅我。我正在编写自己的List类,以更好地了解列表的结构,但是我遇到了一个问题。当我向列表中添加更多项目时,我动态分配了我的列表,并且我的程序上的解构器在 ints 上运行得很好。但是,当我使用 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;
}
我希望代码运行良好,如果我犯了错误,我认为错误会出现在我的代码上。不在标准::字符串上。任何帮助将不胜感激。
[编辑] 在补充说明中,[lastAcc] 缩写为上次访问;这只是我实现的东西,以便更快地浏览列表,而不仅仅是每次都从 0 开始。[prevPos] 显示 [lastAcc] 在列表中的位置。如果您需要查看更多我的代码或解释任何内容,请告诉我~!
您没有初始化 last->nextaddToList
,因此析构函数中的迭代从列表末尾掉了下来。正确的代码是:
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++;
}
相关文章:
- C++:如何将 unix 时间的字符串转换为 *tm?(使用时间错误:"cannot convert 'String' to 'tm*' ")
- 为什么当我在 std::string 中打开文件名的 fstream 时出现"no matching function"错误?
- 错误消息:使用"string* +="后"no match for 'operator+='"
- 将图形表示为unordered_map<字符串、向量>时拓扑排序错误<string>
- OpenCV 3.4.3 中对 'cv::String::d eallocate()' 错误的未定义引用
- 错误:无法传递非平凡类型"std::string"的对象和更多错误
- 由于矢量引起的错误<string>?
- 错误:调用"es_queue::set_rpc_vector(std::vector >&, std::__cxx11::string)"没有匹配函数
- 错误:"cast"未命名类型void setCastDescription(std::string
- 错误:为"运算符 std::string {aka std::__cxx11::basic_string}"指定的返回类型<char>
- 为什么 std::atomic<std::string> 会给出微不足道的可复制错误?
- pip install uwsgi 失败,出现 /usr/local/include/string/string.h:7:10:致命错误:找不到'sstream'文件?
- 如果子类中没有构造函数方法,则错误"no matching function for call to 'LGame::LGame(String&)'"
- 使用 string::p op_back() 的编译错误
- 错误:请求从"Mstream"转换为非标量类型"std::string {aka std::basic_string<char>}"
- C++ 重载:[错误] 与'operator='不匹配(操作数类型为 'String' 和"字符串")
- 运算符重载返回 std::string <<错误
- VS2015无法从'initializer list'转换为'std::string'错误
- C++枚举[string]错误
- 语法错误:标识符'string'错误 C2061