为什么会出现“ 写入访问权限冲突”?
我的源码如下#include <iostream>
#include <string>
using namespace std;
struct DNode
{
string data;
DNode* next;
DNode* piror;
};
void Creat_DNode(DNode**);
int main()
{
DNode *L;
Creat_DNode(&L);
system("pause");
return 0;
}
void Creat_DNode(DNode **L)
{
string ss;
DNode *p, *r;
*L = (DNode*)malloc(sizeof(DNode));
p = r = *L;
cout << "please insert string" << endl;
getline(cin, p->data);
p->next = p->piror = *L;
if (p->data == "")
{
return;
}
while(1)
{
cout << "please insert string:" << endl;
getline(cin, ss);
if (ss == "")
{
break;
}
else
{
p = (DNode*)malloc(sizeof(DNode));
p->data = ss;
p->next = *L;
(*L)->piror = p;
p->piror = r;
r->next = p;
r = p;
}
}
r = *L;
do
{
cout << " " << r->data << " ";
r = r->next;
} while (r->next!=(*L)->next);
cout << endl;
}
这个程序的作用是创建一个双向循环链表。其中的Node结构的data字段用来储存string类的字符串。
但是我在调试运行的时候总是提示我
“引发了异常: 写入访问权限冲突。
_Left 是 0xCDCDCDCD。
如有适用于此异常的处理程序,该程序便可安全地继续运行。”
如果我把data类型改成数字,并对程序做相应的修改,运行就完全没有问题。请看如下程序。
#include <iostream>
#include <string>
using namespace std;
struct DNode
{
int data; //修改点
DNode* next;
DNode* piror;
};
void Creat_DNode(DNode**);
int main()
{
DNode *L;
Creat_DNode(&L);
system("pause");
return 0;
}
void Creat_DNode(DNode **L)
{
int ss; //修改点
DNode *p, *r;
*L = (DNode*)malloc(sizeof(DNode));
p = r = *L;
cout << "please insert string" << endl;
cin >> p->data; //修改点
p->next = p->piror = *L;
if (p->data == 0) //修改点
{
return;
}
while(1)
{
cout << "please insert string:" << endl;
cin >> ss; //修改点
if (ss == 0) //修改点
{
break;
}
else
{
p = (DNode*)malloc(sizeof(DNode));
p->data = ss;
p->next = *L;
(*L)->piror = p;
p->piror = r;
r->next = p;
r = p;
}
}
r = *L;
do
{
cout << " " << r->data << " ";
r = r->next;
} while (r->next!=(*L)->next);
cout << endl;
}
完全没有头绪啊。这是在搞毛啊。{:9_234:}
求助。心已累。
string类型不是会自动申请空间的吗?链表节点也需要申请空间。是不是这个原因? 有道理哦,我用char* 的类型也试了一下,也出现了同样的问题。 malloc只是分配内存,并不进行初始化,不调用类的构造函数,所以当以下这两处调用发生的时候,都会出现错误
getline(cin, p->data); 还有
p = (DNode*)malloc(sizeof(DNode));
p->data = ss;
都是因为string对象的构造函数没有被调用,没有构建string对象。所以,getline函数无法调用string对象进行赋值,同样,date也无法完成赋值。
同理,你修改后的程序,因为使用的是int类型替代string类型,所以没有上面说的情况发生,所以可以运行。
解决办法,用new代替malloc,
p = new(DNode);
new会调用相应类的构造函数完成初始化。 muyu0096 发表于 2016-4-12 08:32
malloc只是分配内存,并不进行初始化,不调用类的构造函数,所以当以下这两处调用发生的时候,都会出现错误 ...
大神啊,好崇拜你。{:9_228:}
好了,运行成功。让我崇拜你吧。看来我对C++的理解还不深啊。
页:
[1]