我在一个相对基础的编程类中,我得到了一个我以前从未遇到过的错误。是这样的:
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();
}发布于 2011-05-04 00:38:42
这些是:
delete Arclist;
delete Nodelist;应该是:
delete [] Arclist;
delete [] Nodelist;或者更好的是,忘记使用动态分配的数组,而使用std::vector。
发布于 2011-05-04 00:38:30
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()将自动返回)。
发布于 2011-05-04 00:39:28
规则很简单。如果使用new初始化数组,则必须使用delete[]语句将其删除。
所以你必须说
delete[] Arclist;
delete[] Nodelist;https://stackoverflow.com/questions/5872718
复制相似问题