0

Segmentation fault (core dumped) というエラーが表示され続けるので、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

セグメンテーション違反の意味は、操作に必要なアクセス許可 (通常は読み取り/書き込みアクセス許可ですが、場合によっては実行アクセス許可も) を持たないページにアクセスしようとしたことです。つまり、実際には存在しない、またはアクセスできないものにアクセスしようとしたことをシステムが通知します。

最終的にセグメンテーション違反につながる典型的な問題が多数あります。それらのいくつかを次に示します。

  • 初期化されていないポインターが逆参照されます。
  • null ポインターが逆参照されます。
  • 配列はその境界の外でアクセスされるため、配列要素であるかのようにランダム メモリにアクセスします。
  • 解放されたオブジェクトは、削除された後のオブジェクトやスタック上にあったオブジェクトなど、ライブであるかのように使用されています。
  • …などなど、似たようなものはたくさんあります。

実際に発生しているセグメンテーション違反についてのヘルプを得るには、問題を示す短いが完全な例を提供する必要があります。問題に関連していると思われるいくつかの行を引用すると、実際の問題が実際に含まれている可能性は低くなります。

于 2013-08-11T22:03:26.140 に答える
0

Product::get_inventory() から返される価値のある在庫がないようです。これはコンパイルされないか、関連性があることを示していないコードがあると思います。最も可能性が高いのは後者で、変数 inventory は返された時点ではまだ初期化されていません。

于 2013-08-11T21:57:26.067 に答える