简体   繁体   English

如何纠正分割错误?

[英]How to correct a segmentation fault?

I keep getting an error Segmentation fault (core dumped), so I ran valgrind. 我不断收到错误分段错误(核心已转储),因此我运行了valgrind。 It is my first time using it, so not sure what to do to get my code working. 这是我第一次使用它,所以不确定如何使我的代码正常工作。 I've tried changing it, but it still says core dumped, or I receive more errors than I had before. 我曾尝试更改它,但它仍然显示核心已转储,或者我收到的错误比以前更多。 I did try debugging the code with gdb, but the debugger was not working properly. 我曾尝试使用gdb调试代码,但调试器无法正常工作。

and corresponding 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

This is my product.cpp:41 这是我的产品。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;
}

This is my main program store 这是我的主程序商店

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

} } 瓦尔格朗德

The meaning of a segmentation fault is that you tried to access a page which doesn't have the permissions (normally read/write permission but possibly also executable permission) needed for the operation. 分段错误的含义是您尝试访问的页面不具有操作所需的权限(通常为读/写权限,但也可能具有可执行权限)。 That is, the system tells you that you tried to access something which isn't really there or which is inaccessible. 也就是说,系统告诉您您尝试访问的内容不是真正存在的或无法访问的。

There are many typical problems eventually resulting in segmentation faults. 有许多典型的问题最终导致分割错误。 Here are a few of those: 以下是其中一些:

  • An uninitialized pointer is dereferenced. 未初始化的指针被取消引用。
  • A null pointer is dereferenced. 空指针被取消引用。
  • An array is accessed outside its boundaries, thus accessing random memory as if it were an array element. 在数组的边界之外访问数组,从而像访问数组元素一样访问随机内存。
  • A released object is being used as if it is live, eg, an object after being deleted or an object which was on the stack. 使用已释放的对象就像它是活动的一样,例如,删除后的对象或堆栈中的对象。
  • ... and many more similar stuff. ...还有更多类似的东西。

To get help with the actual segmentation fault you have, you'll need to provide a short but complete example exhibiting the problem. 要获得有关实际细分错误的帮助,您需要提供一个简短但完整的示例来展示问题。 Quoting a few lines which you think are related to the problem are generally rather unlikely to actually contain the actual problem. 引用一些您认为与问题相关的行通常不太可能实际包含实际问题。

You don't appear to have any value inventory to return from Product::get_inventory(). 您似乎没有从Product :: get_inventory()返回的任何价值库存。 I would think that either this wouldn't compile, or you have some code that you haven't shown that is relevant. 我认为这要么无法编译,要么您有一些未显示的相关代码。 Most likely, the latter is the case, and the variable inventory is not yet initialized at the time that it is returned. 后者很可能是这种情况,并且变量清单在返回时尚未初始化。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM