C ++窗口触发了一个断点 - 堆损坏

时间:2015-01-29 08:46:13

标签: c++ windows

此错误一直被调用,我无法弄清楚原因。

enter image description here

每次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只是为了测试不同的东西。

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

改变这个:

char* str = new char[sizeof(list->getNumber())]

表达式sizeof(list->getNumber())在编译期间被评估为sizeof(int)

事实上,即使在运行时以某种方式“神奇地”评估它,它仍然不会给你所需的实际字符串长度。

您需要的是计算number中有多少位数(包括必要的符号),然后分配所需数量加1(对于空字符)。

顺便说一下,既然你是用C ++做的,那么你也可以使用string


<强>更新

我刚刚注意到你有很多其他与字符串相关的问题:

  • char* tmp的分配中,您应该为null-character
  • 添加1
  • 您遇到的问题类似于我提到的问题,分配了char* c
  • 您正在重新分配str而不首先解除分配(即,这将导致内存泄漏)
  • 您的所有字符串都不会以空值终止;因此,对其中任何一个应用strlenstrcat都会产生未定义的行为(并且很可能在某些时候发生内存访问冲突)

答案 1 :(得分:0)

这一行看起来很可疑:

char *str = new char[sizeof(list->getNumber())];

假设sizeof(int)是4个字节,这意味着您正在分配一个只能容纳3个字符加上结束空字符的字符串。

通常,当我需要快速分配空间来保存转换为字符串的整数时,我会多个sizeof() * 5。这应该足够大以容纳任何整数类型的任何值包括负值的任何基数10字符串。因此,这是你的新行:

char *str = new char[5*sizeof(list->getNumber())];