У меня есть класс AccountMap в AccountMap.h и AccountMap.cpp. Он читает материал из двоичного файла (что нормально) и выводит материал. Он прекрасно работает на компиляторе g ++, но выдает ошибку seg на компиляторе sun c ++ CC, когда я использую оператор new для 10 итераций в одной из моих функций. Если я игнорирую ошибку сегмента, она все равно выдает правильную вещь. Вот мой AccountMap.h:
#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 dataprivate:
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, которая вызывает ошибку seg:
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
Вы выделяете место для одного персонажа …
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
ключи: у вас будет гораздо больше шансов избежать ошибок (включая утечки памяти, особенно если у вас есть исключения).