-4

我正在学习 c++,并且正在开发一个程序,该程序不断给我一个“未分配指针被释放”错误。它是一个杂货店程序,从 txt 文件中输入数据,然后用户可以输入商品编号和数量。我已经阅读了类似的问题,但让我失望的是“指针”问题。如果有人可以看看并帮助我,我将不胜感激。我在 Mac 上使用 Netbeans IDE 7.2。我只会发布我到目前为止的整篇文章。谢谢。

#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;

} 
4

2 回答 2

2

iUserItemCount从未初始化。当您将其用作索引时,您正在调用未定义的行为。

于 2012-09-23T09:16:57.680 回答
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);
    //...//
}
于 2012-09-23T11:53:26.443 回答