经典人物 发表于 2016-4-11 21:48:14

为什么会出现“ 写入访问权限冲突”?

我的源码如下
#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:}
求助。心已累。

forest_mouse 发表于 2016-4-12 00:39:11

string类型不是会自动申请空间的吗?链表节点也需要申请空间。是不是这个原因?

经典人物 发表于 2016-4-12 06:44:22

有道理哦,我用char* 的类型也试了一下,也出现了同样的问题。

muyu0096 发表于 2016-4-12 08:32:34

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会调用相应类的构造函数完成初始化。

经典人物 发表于 2016-4-12 18:14:19

muyu0096 发表于 2016-4-12 08:32
malloc只是分配内存,并不进行初始化,不调用类的构造函数,所以当以下这两处调用发生的时候,都会出现错误 ...

大神啊,好崇拜你。{:9_228:}

经典人物 发表于 2016-4-12 18:47:50



好了,运行成功。让我崇拜你吧。看来我对C++的理解还不深啊。
页: [1]
查看完整版本: 为什么会出现“ 写入访问权限冲突”?