0

我不断收到错误分段错误(核心转储),所以我运行了 valgrind。这是我第一次使用它,所以不知道该怎么做才能让我的代码正常工作。我试过改变它,但它仍然说核心转储,或者我收到比以前更多的错误。我确实尝试使用 gdb 调试代码,但调试器无法正常工作。

和相应的product.h

#ifndef GS_PRODUCT
#define GS_PRODUCT

#include <iostream>
#include <string>

using namespace std;

class Product
{
private:
        int plu_code;
        string name;
        double price;
        bool by_weight;
        double inventory;
public:
        Product(int p_code = 0, string p_name = "", bool p_by_weight = true, double p_price = 0.0, double p_inv = 0.0);
        bool sold_by_weight(void);
        double compute_cost(double weight_or_unit);
        string get_name(void);
        int get_plu_code(void);
        double get_price(void);
        double get_inventory(void);
};

#endif

这是我的产品.cpp:41

 #include <iostream>
#include <string>

#include "product.h"

using namespace std;

Product::Product(int p_code, string p_name, bool p_by_weight, double p_price, double p_inv)
{
    plu_code = p_code;
    name = p_name;
    by_weight = p_by_weight;
    price = p_price;
    inventory = p_inv;
}

bool Product::sold_by_weight(void)
{
    return by_weight;
}

double Product::compute_cost(double weight_or_units)
{
    inventory -= weight_or_units;
    return weight_or_units * price;
}

string Product::get_name(void) {
    return name;
}

int Product::get_plu_code(void) {
    return plu_code;
}

double Product::get_price(void) {
    return price;
}

double Product::get_inventory(void) {
    return inventory;
}

这是我的主要程序商店

#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
#include <sstream>

#include "product.h"
#include "Tokenizer.h"
#include "LookupTable.h"

using namespace std;


LookupTable<Product *> table;
int numProducts = 0;
void checkout()
{    

}

int main()
{
    int plu;
    string name;
    int weight;
    double inv;
    double price;

    table.addRange(0, 9999);
    table.addRange(90000, 99999);

    //  std::string line;
    //Input file
    ifstream infile("inventory.csv");
    if(infile.fail())
        perror("Could not open file ");

    stringstream ss;
    while(infile.good())
    {    
        string line = "";
        //read a product info from file
        getline(infile, line);

        Tokenizer tok(line, ",");
        ss<<line;
        //string token = tok.next();

        ss >> plu >> name >> weight >> price >>inv;

        table[plu] = new Product(plu, name,weight, price,inv);
        numProducts++;
    }
    infile.close();

    checkout();
    ofstream outfile;
    outfile.open("output.csv");
    for(int i=0; i< numProducts; i++)
    {
        outfile<< table[i]-> get_plu_code() << "" << table[i]->get_name()<<""<<table[i]->sold_by_weight() <<""<<table[i]->get_price() <<""<<table[i]->get_inventory();
    }
    outfile.close();

    return 0;

} 瓦尔格林德

4

2 回答 2

1

分段错误的含义是您尝试访问的页面没有操作所需的权限(通常是读/写权限,但也可能是可执行权限)。也就是说,系统会告诉您您试图访问一些实际上并不存在或无法访问的东西。

有许多典型的问题最终导致分段错误。以下是其中一些:

  • 取消引用未初始化的指针。
  • 取消引用空指针。
  • 数组在其边界之外被访问,因此访问随机内存就像它是一个数组元素一样。
  • 被释放的对象被使用,就好像它是活的一样,例如,被删除后的对象或堆栈上的对象。
  • ...以及更多类似的东西。

要获得有关实际分段错误的帮助,您需要提供一个简短但完整的示例来展示该问题。引用您认为与问题相关的几行通常不太可能实际包含实际问题。

于 2013-08-11T22:03:26.140 回答
0

您似乎没有任何可从 Product::get_inventory() 返回的有价值库存。我认为要么这不会编译,要么你有一些你没有显示的相关代码。很可能是后者,并且变量库存在返回时尚未初始化。

于 2013-08-11T21:57:26.067 回答