首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在已删除的已分配内存上调试断言失败

问在已删除的已分配内存上调试断言失败
EN

Stack Overflow用户
提问于 2011-05-04 00:35:30
回答 3查看 2.9K关注 0票数 0

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

代码语言:javascript
复制
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)

以下是我的代码,当分配的内存被删除时,错误弹出,如下所示

代码语言:javascript
复制
    //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();
}
EN

回答 3

Stack Overflow用户

发布于 2011-05-04 00:38:42

这些是:

代码语言:javascript
复制
delete Arclist;
delete Nodelist;

应该是:

代码语言:javascript
复制
delete [] Arclist;
delete [] Nodelist;

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

票数 3
EN

Stack Overflow用户

发布于 2011-05-04 00:38:30

代码语言:javascript
复制
Arclist = new Arc[ARCSIZE];
Nodelist = new string[NODESIZE]; 

和

代码语言:javascript
复制
delete Arclist;
delete Nodelist;

不匹配,which is an error。

你的意思是:

代码语言:javascript
复制
delete[] Arclist;
delete[] Nodelist;

您的环境正在检测到分配和释放之间存在不匹配的情况。

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

顺便说一句,您的main()函数必须返回int (尽管如果愿意,您可以省略显式的return 0;;如果省略它,main()将自动返回)。

票数 2
EN

Stack Overflow用户

发布于 2011-05-04 00:39:28

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

所以你必须说

代码语言:javascript
复制
delete[] Arclist;
delete[] Nodelist;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5872718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档