2013-08-11 5 views
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 

Это мой product.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; 

} Valgrind

+1

Можете ли вы показать, как распределяется «таблица» и реализация «Product» ctor? – simonc

+0

Пожалуйста, размещайте весь код, а не просто разделяйте класс на его публичную часть. Я подозреваю, что неинициализированные переменные. Как выглядит «таблица»? – DUman

+1

Я бы сказал, что у вас свисающий указатель. И наверняка работает gdb. Попробуйте запустить его под gdb, и когда он разбился и отбрасывает вас на отладчик, посмотрите bt/backtrace, чтобы посмотреть, где вы находитесь. Проверьте переменные, переместите вверх/вниз стек и осмотритесь. – Tomek

ответ

0

У вас нет какой-либо стоимости инвентаря для возврата из продукта :: get_inventory(). Я бы подумал, что либо это не будет компилироваться, либо у вас есть код, который вы не показали, что имеет значение. Скорее всего, последнее имеет место, и переменная инвентаризация еще не инициализирована в момент ее возврата.

+0

Инвентарь должен быть прочитан с существующий файл – user2644360

1

Смысл ошибки сегментации заключается в том, что вы пытались получить доступ к странице, которая не имеет разрешений (обычно разрешение на чтение и запись, но, возможно, также исполняемое разрешение), необходимых для операции. То есть система сообщает вам, что вы пытались получить доступ к тому, что на самом деле не существует или недоступно.

Существует много типичных проблем, которые в конечном итоге приводят к ошибкам сегментации. Вот некоторые из них:

  • Неинициализированный указатель разыменовывается.
  • Нулевой указатель разыменовывается.
  • Доступ к массиву осуществляется за пределами его границ, таким образом, доступ к случайной памяти, как если бы это был элемент массива.
  • Освобожденный объект используется, как если бы он был живым, например, объект после его удаления или объект, который был в стеке.
  • ... и многие другие подобные вещи.

Для получения справки об актуальной ошибке сегментации вам необходимо предоставить короткий, но полный пример, демонстрирующий проблему. Цитирование нескольких строк, которые вы думаете, связаны с проблемой, как правило, маловероятно, чтобы фактически содержать фактическую проблему.

Смежные вопросы