2015-06-02 3 views
0

У меня есть класс AccountMap в AccountMap.h и AccountMap.cpp. Он читает материал из двоичного файла (это нормально) и выводит материал. Он отлично работает на компиляторе g ++, но дает мне ошибку seg на компиляторе sun C++ CC, когда я использую новый оператор для 10-итераций в одной из моих функций. Если я игнорирую сегрегатор, он все равно выводит правильную вещь. Вот мой AccountMap.h:Ошибка сегментации с помощью компилятора Sun C++

#ifndef account_map 
#define account_map 

#include <iostream> 
#include <map> 
#include <cstring> 
#include "Account.h" 

using namespace std; 

struct CompareCharArrays 
{ 
    bool operator()(const char* a, const char* b) const //overloading() operator 
    { 
     if((strcmp(a,b) < 0)) 
     { 
      return true; 
     } 
     return false; 
    } 
}; 

class AccountMap 
{ 
    public: 
     ~AccountMap(); //destructor 
     void loadData(const char *); //loads data from a given file 
     int countRecs(const char *); //counts total number of records in the given file 
     void displayData(); //displays data 


    private: 
     multimap<const char *, Account, CompareCharArrays> accounts; //a multipmap 
     Account** account_manager; //two-D array of accounts 
     char** key_manager; //two-D array of keys 
     int total_accounts; //total number of accounts 
}; 

#endif 

Вот моя функция AccountMap.cpp, что вызывает ошибку сегм:

void AccountMap::loadData(const char * file) //loads data from a given file 
{ 
    int num = countRecs(file); //total no of records in the file 
    ifstream in(file, ios::in | ios::binary); 
    if(!in) 
    { 
     cerr<<"File doesn't exist!"<<endl; 
     exit(1); 
    } 
    this->account_manager = new (nothrow) Account*[num]; 
    if(this->account_manager == NULL) 
    { 
     exit(1); 
    } 
    this->key_manager = new (nothrow) char*[num]; //seg fault here during 10th iteration 
    if(this->key_manager == NULL) 
    { 
     exit(1); 
    } 
    simplyfy_data acc; 
    this->total_accounts = 0; 
    while(in.read((char*)&acc, sizeof(simplyfy_data))) 
    { 
     this->account_manager[this->total_accounts] = new (nothrow) Account; 
     if(this->account_manager[this->total_accounts] == NULL) 
     { 
      exit(1); 
     } 
     this->key_manager[this->total_accounts] = new (nothrow) char; 
     if(this->key_manager[this->total_accounts] == NULL) 
     { 
      exit(1); 
     } 
     string date; 
     int len = strlen(acc.dob); 
     for(int i = 0; i < len; i++) 
     { 
      date.push_back(acc.dob[i]); 
     } 
     account_manager[this->total_accounts]->set_data(acc.number,acc.name,acc.sex,date,acc.address,acc.balance); 
     strcpy(key_manager[this->total_accounts],acc.name); 
     this->accounts.insert(pair<const char* const, Account>(key_manager[this->total_accounts],(*account_manager[this->total_accounts]))); //inserting 
     this->total_accounts++; 
    } 
    in.close(); 
} 

Ошибка является:

signal SEGV (no mapping at the fault address) in realfree at 0xa2958440 
0xa2958440: realfree+0x0068: ld  [%o7 + 8], %o5 

ответ

4

Вы выделить пространство для одного символа ...

this->key_manager[this->total_accounts] = new (nothrow) char; 

... п скопировать много ...

strcpy(key_manager[this->total_accounts],acc.name); 

Вы должны использовать std::string и std::vector, и избежать new и const char* в multimap ключей: вы будете массово более вероятно, чтобы избежать ошибок (в том числе утечек памяти, особенно если у вас есть исключения).

+0

Спасибо @Tony застрял на этом какое-то время! Если бы он дал мне ошибки на g ++, я бы это выяснил, но он только дал ошибки в CC, и я подумал, что есть какая-то проблема с CC, а не с моей программой. Но привет спасибо ' –

+0

@FahadUrRehman: добро пожаловать. Нечеткое поведение, подобное этому, может случиться только для определенных параметров компилятора, флагов, когда какая-либо другая функция вызвана заранее или после этого и т. Д. - может понять, почему вы подозреваете CC. Приветствия. –

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