【问题标题】:Read Access Violation Code: 0xCDCDCDE1 and Code :0xCDCDCDE1读取访问冲突代码:0xCDCDCDE1 和代码:0xCDCDCDE1
【发布时间】:2016-12-21 06:07:29
【问题描述】:

我正在使用 Link List C++ 做一个购物中心项目。我必须在其中插入新商店、搜索商店、删除商店、计数商店并显示所有。我写了一些代码。 我写了代码但是: (1) 当我第二次输入并在最后一次输入时按下输入后,它给出了输入错误,我给出了以下异常。

"抛出异常:读取访问冲突。 std::_String_alloc > >::_Mysize(...) 返回 0xCDCDCDE1。” (2) 当我显示它时,给出以下异常: 抛出异常:读取访问冲突。 温度为 0xCDCDCDCD。 这是主要的。

int main()
{
ShoppingMallList* shopList=new ShoppingMallList();
string name=""; 
int shopNumber;
string brandShop;
int floor; 
string shoptype;


do
{

    system("cls");
    cout << "**************WELCOME TO MALL**************\n1: Add Shop\n2: Search Shop\n3: Count Shops\n4:Display Shops\n5: Quit" << endl;
    int option;
    cin >> option;
    switch (option)
    {
        case 1:
        {
            input(name, shopNumber, brandShop, floor, shoptype);
            shopList->Insert(name, shopNumber, brandShop, floor, shoptype);
        }
        break;
        case 2:
        {
            string name1;
            cin.clear();
            cin.ignore();
            cout << "Enter Name of Shop to Search: ";
            getline(cin, name1);
            shopList->search(name1);
        }
        break;
        case 4:
        {
            shopList->Print();
        }
        break;
        case 5:
        {
            shopList->~ShoppingMallList();
            exit(0);
        }
        break;
        default:
            continue;
    }
    system("pause");

    shopList;
} while (true);

return 0;
}  
void input(string& name, int& shopNumber, string& brandShop, int& floor,      string& shoptype)
{
char temp;
cin.clear();
cin.ignore();
cout << "Enter Name: ";
getline(cin, name);
cout << "Enter Shop Number: ";
cin >> shopNumber;
cin.clear();
cin.ignore();
cout << "Enter Brand(yes/no): ";
getline(cin, brandShop);
cout << "Enter Floor: ";
cin >> floor;
cin.clear();
cin.ignore();
cout << "Enter Shop Type: ";
getline(cin, shoptype);
}

这里是shoppingMall.h

class ShoppingMall
{
friend std::ostream& operator<<(std::ostream& cout, const ShoppingMall&   shop);
friend class ShoppingMallList;
public:
ShoppingMall(std::string& , int&, std::string&, int&, std::string&);

private:
std::string name;
int shopNumber;
std::string brandshop;
int floor;
std::string shopType;
ShoppingMall* link;

};

ShoppingMall::ShoppingMall(std::string& name , int& shopNumber, std::string&         brandShop, int& floor, std::string& shoptype) : name(name),    shopNumber(shopNumber), brandshop(brandShop), floor(floor), shopType(shoptype)
{

}

std::ostream& operator<<(std::ostream& cout, const ShoppingMall& shop)   
{
cout << "Name: " << shop.name << std::endl << "Shop Number: " <<           shop.shopNumber << std::endl << "Brand Shop: " << shop.brandshop << std::endl <<    "Floor: " << shop.floor << std::endl << "Shop Type: " << shop.shopType <<    std::endl;
return cout;
}

这里是 ShoppingMallList.h 头文件。

class ShoppingMallList
{
public:
ShoppingMallList();
void addToHead(std::string&, int&, std::string&, int&, std::string&);
void Insert(std::string&, int&, std::string&, int&, std::string&);
void Print();
int getsize();
void deleteShop(std::string&);
void search(std::string&);

private:
ShoppingMall* head;
int size;
};

ShoppingMallList::ShoppingMallList() : head(0), size(0)
{
}

void ShoppingMallList::addToHead(std::string& name, int& shopNumber,       std::string& brandShop, int& floor, std::string& shoptype)
{
ShoppingMall* temp = new         ShoppingMall(name,shopNumber,brandShop,floor,shoptype);
if (head==0)
{
    head = temp;
}
else
{
    temp->link = head;
    head = temp;
}
size++;
}

int ShoppingMallList::getsize()
{
return size;
}
void ShoppingMallList::Print()
{
 ShoppingMall* temp = head;

while ( temp != 0 )
{
    std::cout << "Name: " << temp->name << std::endl << "Shop Number: " <<     temp->shopNumber << std::endl << "Brand Shop: " << temp->brandshop << std::endl    << "Floor: " << temp->floor << std::endl << "Shop Type: " << temp->shopType <<    std::endl;
    temp = temp->link;
}
}
void ShoppingMallList::Insert(std::string& name, int& shopNumber,       std::string& brandShop, int& floor, std::string& shoptype)
{
ShoppingMall* newShop = new ShoppingMall(name, shopNumber, brandShop, floor,   shoptype);

//case-1 EmptyList

if ( head == 0 )
{
    head = newShop;
}
else
{
    ShoppingMall* temp = head;
    ShoppingMall* previous = 0;

    // Traversing link to find insert location
    while (temp!=0)
    {

        if ( temp->name >= newShop->name )
        {
            break;
        }
        else
        {
            previous = temp;
            temp = temp->link;
        }
    }
    //case-2 Adding To Head
    if ( temp == head )
    {
        newShop->link = head;
        head = newShop;
    }
    //case-3 Adding After Head
    else
    {
        newShop->link = temp;
        previous->link = newShop;
    }

 }
 size++;
 }
 void ShoppingMallList::deleteShop(std::string& name)
 {
  ShoppingMall* temp=head;
  ShoppingMall* previous = 0;

if (head == 0)
 {
    //Case-1 If There is no node
    std::cout << "Shop cannot be deleted becasue the there no Node " <<    std::endl;
 }
 //Traversing Node to find node to delete
 while (temp!=0)
 {
    if ( temp->name == name ) 
    {
        break;
    }
    else
    {
        previous = temp;
        temp = temp->link;
    }
 }

 //case-2 If Shop with name passed not found
 if ( temp == 0 )
 {
    std::cout << "Shop of name " << name << " not found!" << std::endl;
 }
 else
 { 
    //case-3 Delete node from head Node
    if ( temp == head )
    {
        head = head->link;
    }
    //delete other than head shop
    else
    {
        previous->link = temp->link;
    }
    delete temp;
    size--;
 } 
 }
 void ShoppingMallList::search(std::string& name)
 {
 ShoppingMall* tempShop = head;
 while ( tempShop != 0 )
 {
    if (tempShop->name == name)
    {
        std::cout << "Name: " << tempShop->name << std::endl << "Shop     Number: " << tempShop->shopNumber << std::endl << "Brand Shop: " << tempShop-  >brandshop << std::endl << "Floor: " << tempShop->floor << std::endl << "Shop    Type: " << tempShop->shopType << std::endl;
    }
    else
    {
        tempShop = tempShop->link;
    }
}

if ( tempShop == 0 )
{
    std::cout << "Shop of name " << name << " not found!" << std::endl;
}

}

【问题讨论】:

  • 不要注意十六进制代码。注意消息-“读取访问冲突”-并尝试了解原因
  • 我猜你来自Java——你的程序开头的shopList 可能不应该是一个指针,而只是一个普通的堆栈分配变量。像这样简单地声明它:ShoppingMallList shopList;(这将使用默认构造函数对其进行初始化;非指针变量不能为空)。
  • 另外,不要显式调用析构函数 (shopList-&gt;~ShoppingMallList();)。要销毁 new 分配的指针,请使用 delete (delete shopList;)。但是,如果您使用的是普通的堆栈分配变量,那么当变量超出范围/程序退出时,会自动调用析构函数并销毁对象。
  • 最后,除非这是一个学术练习,否则您应该使用标准库中的std::list 作为链表。它已经过测试,工作正常,并带有许多实用功能。
  • 注意十六进制值,0xcdcdcdcd 表示你正在读取一个未初始化的值。始终是一个错误,该值旨在故意生成 AVE。

标签: c++ c++11 linked-list


【解决方案1】:

ShoppingMall 类的link 字段未在构造函数中初始化,并且包含一些随机垃圾。所有列表迭代如:

while ( temp != 0 ) 
{
  // Code skipped for simplicity 
  temp = temp->link;
}

可能导致访问冲突,因为条件temp != 0 从未遇到并跳过随机地址处的代码访问内存。

修复它:

ShoppingMall::ShoppingMall(const std::string& name, int shopNumber, std::string& brandShop, int floor, const std::string& shoptype) 
  : link(nullptr), name(name), shopNumber(shopNumber), brandshop(brandShop), floor(floor), shopType(shoptype)
{
}

【讨论】:

  • 谢谢它的工作。我也认为它们可能是垃圾或垃圾值。
  • 但是他们有更好的方法吗?
  • @SaimSajid 你可以考虑使用smart pointer。阅读链接下的智能指针部分。另请查看"Singly linked-list with smart pointers" 以获取示例。
  • 非常感谢尼基塔。
猜你喜欢
  • 2020-12-28
  • 2020-11-06
  • 1970-01-01
  • 2019-08-18
  • 1970-01-01
  • 2016-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多