繁体   English   中英

如何纠正分割错误?

[英]How to correct a segmentation fault?

我不断收到错误分段错误(核心已转储),因此我运行了valgrind。 这是我第一次使用它,所以不确定如何使我的代码正常工作。 我曾尝试更改它,但它仍然显示核心已转储,或者我收到的错误比以前更多。 我曾尝试使用gdb调试代码,但调试器无法正常工作。

和相应的产品

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

} 瓦尔格朗德

分段错误的含义是您尝试访问的页面不具有操作所需的权限(通常为读/写权限,但也可能具有可执行权限)。 也就是说,系统告诉您您尝试访问的内容不是真正存在的或无法访问的。

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

  • 未初始化的指针被取消引用。
  • 空指针被取消引用。
  • 在数组的边界之外访问数组,从而像访问数组元素一样访问随机内存。
  • 使用已释放的对象就像它是活动的一样,例如,删除后的对象或堆栈中的对象。
  • ...还有更多类似的东西。

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

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

暂无
暂无

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

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