此错误一直被调用,我无法弄清楚原因。
每次setNext(new Node(nullptr));被称为此错误弹出
完整代码:
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
class Node
{
Node *next;
int number;
public:
Node(Node *newNextNode) : next(newNextNode) { number = 0; };
~Node()
{
delete next;
}
int getNumber();
void setNext(Node *newNextNode) { next = newNextNode; } ///This fails when called calling addNode()
Node *getNext() { return next; }
};
int Node::getNumber()
{
return number;
}
class LinkedList
{
Node *list;
public:
LinkedList()
{
list = new Node(nullptr);
}
~LinkedList()
{
delete list;
}
void addNode();
void printList();
};
void LinkedList::addNode()
{
Node *temp = list;
while(temp->getNext() != nullptr)
{
temp = temp->getNext();
}
temp->setNext( new Node(nullptr) );
}
void LinkedList::printList()
{
char *str = new char[sizeof(list->getNumber())];
itoa(list->getNumber(), str, 10);
Node *temp = list;
while( temp->getNext() != nullptr )
{
char *c = new char[sizeof(temp->getNumber())];
itoa( temp->getNumber(), c, 10 );
char *tmp = new char[strlen(str) + strlen(c)];
strcat(tmp, ' ' + c);
strcat(tmp, str);
str = new char[strlen(tmp)];
strcpy(str, tmp);
delete [] tmp;
delete [] c;
}
string result(str);
delete [] str;
//return result;
}
int main()
{
LinkedList *list = new LinkedList();
list->addNode();
list->printList();
cin.get();
delete list;
return 0;
}
:) ok这里是完整的代码。我知道很多事情并不是最有效的做事方式。防爆。我正在做printlist只是为了测试不同的东西。
感谢您的帮助!
答案 0 :(得分:3)
改变这个:
char* str = new char[sizeof(list->getNumber())]
表达式sizeof(list->getNumber())
在编译期间被评估为sizeof(int)
。
事实上,即使在运行时以某种方式“神奇地”评估它,它仍然不会给你所需的实际字符串长度。
您需要的是计算number
中有多少位数(包括必要的符号),然后分配所需数量加1(对于空字符)。
顺便说一下,既然你是用C ++做的,那么你也可以使用string
。
<强>更新强>
我刚刚注意到你有很多其他与字符串相关的问题:
char* tmp
的分配中,您应该为null-character char* c
str
而不首先解除分配(即,这将导致内存泄漏)strlen
或strcat
都会产生未定义的行为(并且很可能在某些时候发生内存访问冲突)答案 1 :(得分:0)
这一行看起来很可疑:
char *str = new char[sizeof(list->getNumber())];
假设sizeof(int)
是4个字节,这意味着您正在分配一个只能容纳3个字符加上结束空字符的字符串。
通常,当我需要快速分配空间来保存转换为字符串的整数时,我会多个sizeof() * 5
。这应该足够大以容纳任何整数类型的任何值包括负值的任何基数10字符串。因此,这是你的新行:
char *str = new char[5*sizeof(list->getNumber())];