C++,错误,本机"已退出,代码为 -1073741819 (0xc0000005)
C++, Error, Native' has exited with code -1073741819 (0xc0000005)
我用c++写了一个程序,但是在调试中我遇到了一个问题,如果你能帮助我,我将很高兴在这段代码中,源代码和错误已在以下声明:
错误是:
Unhandled exception at 0x011019d6 in 33.exe: 0xC0000005: Access violation reading location 0xcdcdcdcd.
代码是:
#include <iostream>
#include <string>
using namespace std;
const int maxCard =100;
//enum Boll {false, true};
class Contact
{
public:
Contact (const char *name, const char *address, const char *tell);
//~ Contact(void);
const char* Name (void) const {return name;}
const char* Address (void) const {return address;}
const char* Tell (void) const {return tell;}
friend ostream& operator<< (ostream&, Contact&);
private:
char *name;
char *address;
char *tell;
};
class ContactDir
{
public:
ContactDir(const int maxSize);
//~ContactDir(void);
void Insert(const Contact &);
void Delete(const char *name);
Contact* Find(const char *name);
friend ostream& operator <<(ostream&, ContactDir&);
private:
int Lookup (const char *name);
Contact **contacts;
int dirSize;
int maxSize;
};
Contact::Contact(const char *name, const char *address, const char *tell)
{
Contact::name= new char [strlen(name)+1];
Contact::address= new char [strlen(address)+1];
Contact::tell= new char [strlen(tell)+1];
strcpy(Contact::name, name);
strcpy(Contact::address, address);
strcpy(Contact::tell,tell);
}
/*Contact::~Contact (void)
{
delete name;
delete address;
delete tell;
}*/
ostream &operator<<(ostream &os, Contact &c)
{
os<<"("<<c.name<<","<<c.address<<","<<c.tell<< ")";
return os;
}
ContactDir::ContactDir (const int max)
{
typedef Contact *ContactPtr;
dirSize=0;
maxSize=max;
contacts= new ContactPtr[maxSize];
};
/*ContactDir::~ContactDir (void)
{
for(register int i=0; i<dirSize; ++i)
delete contacts[i];
delete []contacts;
}*/
void ContactDir::Insert (const Contact& c)
{
if (dirSize<maxSize)
{
int idx= Lookup(c.Name());
if(idx>0 &&strcmp(c.Name(), contacts[idx]->Name())==0)
{
delete contacts [idx];
}
else
{
for (register int i=dirSize; i>idx; --i)
contacts[i]=contacts[i-1];
++dirSize;
}
contacts[idx]=new Contact (c.Name(),c.Address(),c.Tell());
}
}
void ContactDir::Delete (const char *name)
{
int idx=Lookup(name);
if(idx<dirSize)
{
delete contacts[idx];
--dirSize;
for (register int i=idx; i<dirSize; i++)
contacts[i]=contacts[i+1];
}
}
Contact *ContactDir::Find (const char *name)
{
int idx= Lookup (name);
return (idx< dirSize && strcmp (contacts[idx]->Name(), name)==0)? contacts[idx]:0;
}
int ContactDir:: Lookup (const char *name)
{
for (register int i=0; i<dirSize; ++i)
if (strcmp (contacts[i]->Name(), name)==0)
return i;
return dirSize;
}
ostream &operator << (ostream &os, ContactDir &c)
{
for (register int i=0; i<c.dirSize; ++i)
os<< *(c.contacts[i]) << 'n';
return os;
}
int main (void)
{
ContactDir dir (10);
dir.Insert(Contact ("JACK","NORWAY", "999999"));
dir.Insert(Contact ("JIMMY","FRANCE", "313131"));
cout<<dir;
}
我同意关于实现的其他建议,但对于您的具体问题:如果您的Lookup
函数没有找到它正在寻找的内容,则返回dir的大小。然后,第二次插入使用contacts[idx]->Name()
中的该值作为索引。idx
为1,但此时数组的第二个单元格中没有值。所以,当你调用Name()
时,你在一个无效的指针上调用它。您忽略了基于1的大小和基于0的索引之间的区别。
一般来说,0xcdcdcdcd是一个常见的模式,由VS在调试版本中对未初始化的指针进行设置。
首先,由于您使用的是c风格字符串和相关函数(strlen
等),您应该使用#include <cstring>
,而不是<string>
-在我的系统上,您的代码无法编译。正如vines在评论中所说,无论如何,使用std::string
会更好。要找到你的问题,你应该像上面说的那样在调试器中运行你的代码。如果您仍然无法找出错误在哪里,请尝试反复从代码中删除功能并运行它以缩小问题的根源。
首先,为什么不使用c++类来处理字符串,比如<string>
中的std::string
?您可以避免像这样的丑陋代码:
Contact::name= new char [strlen(name)+1];
Contact::address= new char [strlen(address)+1];
Contact::tell= new char [strlen(tell)+1];
strcpy(Contact::name, name);
strcpy(Contact::address, address);
strcpy(Contact::tell,tell);
只需输入
Contact::Contact(const char *name, const char *address, const char *tell) : name(name), address(address), tell(tell)
在类中是这样定义的:
std::string name, address, tell;
第二,你为什么又发明轮子?您可以简单地使用位于<map>
中的std::map
,而不是创建自己的ContactDir
类。这是它的文档。
下面的代码实例化一个映射,插入对象并检索它们:
std::map<std::string, Contact> dir;
dir["JACK"] = Contact("JACK","NORWAY", "999999"));
dir["JIMMY"] = Contact ("JIMMY","FRANCE", "313131"));
Object jimmy = dir["JIMMY"];
我知道,我没有找到分段故障发生的确切位置,但我认为这种方法将对您更有帮助。
编辑:我想我也发现了你的问题。在Insert
中,调用Lookup
,如果没有找到元素,则返回dir的大小。但是在Insert
中,您永远不会检查值是否正确。
- 进程返回 -1073741819 (0xC0000005) 错误
- 为什么我不能返回向量<向量<int>>(进程返回 -1073741819 (0xC0000005))
- C++进程以状态 -1073741819 终止
- 薄板样条形状转换运行时错误 [使用代码 -1073741819 退出]
- 进程返回 -1073741819 (0xC0000005) (为什么??
- C 矢量_mylast返回0xc
- 我的程序在尝试将数据集追加到类对象时遇到"Process returned -1073741819 (0xC0000005)"
- 我的链接列表程序在代码块编译器(X0000000005)中以状态-1073741819终止
- Qt创建者错误代码-1073741819
- Comparator语言 - 1073741819 (0xC0000005)
- "Process terminated with status -1073741819" 带有矢量的简单程序
- LEA指令"=> 0xb48daed9 <+3479>: lea -0xc(%ebp),%esp"的意义是什么?
- C++ Qt MingW 错误的重新定位0xc rdata 部分中的地址
- 树二进制C/ c++进程返回-1073741819 (0xC0000005)
- C++,错误,本机"已退出,代码为 -1073741819 (0xc0000005)
- Opencv 程序退出,代码为 -1073741819