Ошибка сегментации с компилятором Sun C++

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

person Fahad Ur Rehman    schedule 02.06.2015    source источник


Ответы (1)


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

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: у вас будет гораздо больше шансов избежать ошибок (включая утечки памяти, и особенно если у вас есть исключения).

person Tony Delroy    schedule 02.06.2015
comment
Спасибо, @Tony застрял на этом на некоторое время! Если бы он выдавал мне ошибки и на g++, я бы понял это, но он выдавал ошибки только на CC, и я подумал, что это какая-то проблема с CC, а не с моей программой. Но эй спасибо - person Fahad Ur Rehman; 02.06.2015
comment
@FahadUrRehman: пожалуйста. Такое хитрое поведение Undefined - может происходить только для определенных параметров компилятора, флагов, когда какая-то другая функция вызывается заранее или после и т. д. - можно понять, почему вы подозреваете CC. Ваше здоровье. - person Tony Delroy; 02.06.2015