C ++运行错误:未分配被释放的指针

时间:2012-09-23 09:06:25

标签: c++

我正在学习c ++并正在研究一个程序,它一直给我一个'指针被释放没有分配'的错误。这是一个从txt文件输入数据的杂货店程序,然后用户可以输入项目#&数量。我已经阅读了类似的问题,但是让我失望的是“指针”问题。如果有人可以看看并帮助我,我将不胜感激。我在Mac上使用Netbeans IDE 7.2。 我将发布迄今为止的整篇文章。 THX。

#include <iostream>
#include <fstream>
#include <string>
#include <vector>

using namespace std;


class Product
{
  public:
      // PLU Code
  int getiPluCode()
  {
    return iPluCode;
  }

  void setiPluCode( int iTempPluCode)
  {
    iPluCode = iTempPluCode;
  }

  // Description
  string getsDescription()
  {
    return sDescription;
  }

  void setsDescription( string sTempDescription)
  {
    sDescription = sTempDescription;
  }

  // Price
  double getdPrice()
  {
    return dPrice;
  }

  void setdPrice( double dTempPrice)
  {
    dPrice = dTempPrice;
  }

  // Type..weight or unit
  int getiType()
  {
    return iType;
  }

  void setiType( int iTempType)
  {
    iType = iTempType;
  }

  // Inventory quantity
  double getdInventory()
  {
    return dInventory;
  }

  void setdInventory( double dTempInventory)
  {
    dInventory = dTempInventory;
  }




    private: 
      int iPluCode;
      string sDescription;
      double dPrice;
      int iType;
      double dInventory;
};


int main ()
{

  Product paInventory[21]; // Create inventory array
  Product paPurchase[21]; // Create customer purchase array

    // Constructor to open inventory input file
    ifstream InputInventory ("inventory.txt", ios::in);
        //If ifstream could not open the file
    if (!InputInventory)
    {
        cerr << "File could not be opened" << endl;
        exit (1);
    }//end if

    int x = 0;

    while (!InputInventory.eof () )
    {
      int iTempPluCode;
      string sTempDescription;
      double dTempPrice;
      int iTempType;
      double dTempInventory;

        InputInventory >> iTempPluCode >> sTempDescription >> dTempPrice >> iTempType >> dTempInventory;

        paInventory[x].setiPluCode(iTempPluCode);
        paInventory[x].setsDescription(sTempDescription);
        paInventory[x].setdPrice(dTempPrice);
        paInventory[x].setiType(iTempType);
        paInventory[x].setdInventory(dTempInventory);

        x++;

    }

    bool bQuit = false;
    //CREATE MY TOTAL VARIABLE HERE!

    int iUserItemCount = 0;
    do
    {
      int iUserPLUCode;
        double dUserAmount;
        double dAmountAvailable;
        int iProductIndex = -1;
        //CREATE MY SUBTOTAL VARIABLE HERE!

        while(iProductIndex == -1)
        {
            cout<<"Please enter the PLU Code of the product."<< endl;

            cin>>iUserPLUCode;

            for(int i = 0; i < 21; i++)
            {
            if(iUserPLUCode == paInventory[i].getiPluCode())
            {
                dAmountAvailable = paInventory[i].getdInventory();
                iProductIndex = i;  
            }
            }

                        //PLU code entry validation
            if(iProductIndex == -1)
            {
              cout << "You have entered an invalid PLU Code.";
            }
        }



        cout<<"Enter the quantity to buy.\n"<< "There are  "<< dAmountAvailable << "available.\n";
        cin>> dUserAmount;

        while(dUserAmount > dAmountAvailable)
        {
         cout<<"That's too many, please try again";
         cin>>dUserAmount;
        }

        paPurchase[iUserItemCount].setiPluCode(iUserPLUCode);// Array of objects function calls
        paPurchase[iUserItemCount].setdInventory(dUserAmount);
        paPurchase[iUserItemCount].setdPrice(paInventory[iProductIndex].getdPrice());       
        paInventory[iProductIndex].setdInventory( paInventory[iProductIndex].getdInventory() - dUserAmount );       

            iUserItemCount++;

        cout <<"Are you done purchasing items? Enter 1 for yes and 0 for no.\n";
        cin >> bQuit;

    //NOTE: Put Amount * quantity for subtotal
    //NOTE: Put code to update subtotal (total += subtotal)

    // NOTE: Need to create the output txt file!

    }while(!bQuit);




  return 0;

} 

2 个答案:

答案 0 :(得分:2)

iUserItemCount永远不会被初始化。当您将其用作索引时,您将调用未定义的行为。

答案 1 :(得分:0)

因为你使用静态分配的数组,你可能在数组结束后偶然发现了写作。

您声明该文件正好有21个条目但是eof条件会发生什么?如果您读取最后一个条目,则流仍然没有设置eof位。这只有在您尝试阅读且没有任何内容时才会发生。 在第21次输入之后,循环仍然继续,因为未设置eof位。它读取垃圾信息并尝试将其存储到paInventory [21]中,但该数组的大小只有21个。

//after last read x=21 and eof not set
while (!InputInventory.eof () )
{
    //first read causes eof to be set
    InputInventory >> iTempPluCode >> sTempDescription >> dTempPrice >> iTempType >> dTempInventory;

    //Accessing paInventory[21] here which causes your error
    paInventory[x].setiPluCode(iTempPluCode);
    //...//
}