调试断言在已删除的已分配内存中失败

时间:2011-05-03 16:35:30

标签: c++

我在一个相对基础的编程课程中,我遇到了一个我从未遇到过的错误。就是这样:

Debug Assertion Failed!

Program:...sual Studio 2010\Projects\Comp Project\Debug\Comp Project.exe
File: f:\dd\vctools\crt_bld\self_x86\crt\src\dbgdel.cpp
Line: 52

Expression:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

这是我的代码,当分配的内存被删除时弹出错误,它看起来像

    //Shortest Path Version 1.01 IN PROGRESS
/*
    This program reads in node and arc data and interpretes it into a list which it can then use
    to calculate the shortest time or distance, depending on user prefrence, between two chosen
    nodes and send pack the path to the user
*/
#include <conio.h>
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
void main()
{
    //opening the files where the data is contained.
    ifstream arcfile;
    ifstream nodefile;
    arcfile.open("G:\\Programming\\Descrete Structures\\arcs2011.txt");
    nodefile.open("G:\\Programming\\Descrete Structures\\nodes2011.txt");

    //creating a class that will store the data relevent to locating the shortest path
    class Arc
    {
    public:
        unsigned short int FROM;                                //from node
        unsigned short int TO;                                    //to node
        double DISTANCE;                                        //distance in miles
        double TIME;                                            //travel time
    };

    //creating a class that will store the data relavent to the node path
    class Node
    {
    public:
        unsigned long int WIEGHT;                                //either time or distance
        unsigned short int FROM;                                //alternativly "via"
        bool* shortestKnown;

    };

    string s;                                                    //placeholder for irrelavent string data
    unsigned short int StartingNode;                            //user selected starting node
    unsigned short int EndingNode;                                //user selected ending node
    unsigned short int ARCSIZE = 0;                                //number of Arcs in arc file
    unsigned short int NODESIZE = 0;                            //number of Nodes in node file

    //////////////////////Begin reading in of Arc data and Node data/////////////////////

    //count number of registered arcs
    while(getline(arcfile,s))
    {
        ARCSIZE++;
    }
    cout<<ARCSIZE<<" line size of arcfile"<<endl;

    //count number of registered nodes
    while(getline(nodefile,s))
    {
        NODESIZE++;
    }
    NODESIZE++;                                                    //final incrementation for +1 format
    cout<<NODESIZE<<" line size of nodefile"<<endl;

    Arc* Arclist;                                                //array that will store all the arcs
    Arclist = new Arc[ARCSIZE];                                    //based on the size of the file
    string* Nodelist;                                            //array that will store the node names
    Nodelist = new string[NODESIZE];                            //based on the size of the file

    //reset the streams
    arcfile.close();
    nodefile.close();
    arcfile.open("G:\\Programming\\Descrete Structures\\arcs2011.txt");
    nodefile.open("G:\\Programming\\Descrete Structures\\nodes2011.txt");


    //loop through and save the arc data to an array
    for(int i=1;i<ARCSIZE;i++)
    {
        arcfile.ignore(1000,'\n');
        arcfile>>Arclist[i].FROM;
        arcfile>>Arclist[i].TO;
        arcfile>>Arclist[i].TIME;
        arcfile>>Arclist[i].DISTANCE;
    }
    //loop through and store node description. Node counting starts at 1 to link up easier with
    //the arcs. The NODESIZE has been increased by 1 to allow for this format.
    for(int i=1;i<NODESIZE;i++)
    {
        getline(nodefile,Nodelist[i],'\t');                        //store node data
        nodefile.ignore(1000,'\n');                                //ignore coordinates
    }

    //////////////////////Begin user interface portion of program////////////////////////////////

    cout<<"Arcs and Nodes loaded."<<endl;
    cout<<"Please select by node number a starting node and ending node."<<endl;
    cout<<"(Press any key to display the list)"<<endl<<endl;
    getch();

    //print out the node list with numarical values
    for(int i=1;i<NODESIZE;i++)
    {
        cout<<i<<" - "<<Nodelist[i]<<endl;
    }
    cout<<endl;
    cout<<"Please select a starting node: ";
    cin>>StartingNode;
    cout<<endl<<"Please select an ending node: ";
    cin>>EndingNode;

    ////////////////////////SOME KIND OF ERROR OCCURS PAST THIS POINT///////////////////////

    //delete allocated memory
    delete Arclist;
    delete Nodelist;


    getch();
}

3 个答案:

答案 0 :(得分:3)

这些:

delete Arclist;
delete Nodelist;

应该是:

delete [] Arclist;
delete [] Nodelist;

或者更好的是,忘记使用动态分配的数组,并使用std::vector

答案 1 :(得分:2)

Arclist = new Arc[ARCSIZE];
Nodelist = new string[NODESIZE]; 

delete Arclist;
delete Nodelist;

不匹配,which is an error

你的意思是:

delete[] Arclist;
delete[] Nodelist;

您的环境检测到分配和取消分配之间的内容不匹配。

实际上,这是非常幸运的,因为C ++标准没有要求任何诊断;在你和其他平台上,这个错误可能会默默地“起作用”并导致各种内存损坏问题!

顺便提一下,您的main()函数必须返回int(如果您愿意,可以省略明确的return 0;;它会自动完成main()如果你把它留下来的话。)

答案 2 :(得分:0)

规则很简单。如果使用new初始化数组,则必须使用delete[]语句将其删除。

所以你必须说

delete[] Arclist;
delete[] Nodelist;