我在一个相对基础的编程课程中,我遇到了一个我从未遇到过的错误。就是这样:
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();
}
答案 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;