读访问违规代码:0xCDCDCDE1和代码:0xCDCDCDE1

时间:2016-12-21 06:07:30

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

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

“抛出异常:读取访问冲突。 std :: _ St​​ring_alloc> > :: _ Mysize(...)返回0xCDCDCDE1。“ (2)当我显示它时给出以下例外: 抛出异常:读取访问冲突。 temp是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;
}

}

1 个答案:

答案 0 :(得分:1)

link类的

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

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)
{
}