Усиление десериализации содержимого объекта не выполняется при выполнении из конструктора, но в противном случае происходит успешно - PullRequest
0 голосов
/ 29 октября 2009

Повышение десериализации содержимого объекта завершается неудачно при выполнении из конструктора, но в противном случае это происходит успешно.

например:.

ContainingClass::ContainingClass() {
    pNA = new objectArray*[NUMBER]; // allocates ptrs
    // ...
    pNA[ii] = new objectArray(SIZE);// allocates object array, and object array
                                    // has a std::map "PatternsMap"
    // ...

    pNA[ii]->load(pNA[ii], "../release/NA Data/NAData_a description_NA0"); //fails
    pNA[ii]->PatternsMap.size(); //size = 0
}

Если я вызываю следующие строки кода после выхода из конструктора, тогда все хорошо:

pNA[ii]->load(pNA[ii], "../release/NA Data/NAData_a description_NA0"); //succeeds
pNA[ii]->PatternsMap.size();//size > 0

Есть идеи? Обратите внимание, что в примере конструктора я проверил, что objectArray был построен первым.

Ответы [ 2 ]

0 голосов
/ 30 октября 2009

Кому: Степан Райко: ConistingClass динамически создается во время выполнения.

Матье М: Похоже, что авторы Boost могли застрять в «фиаско глобальной инициализации».

Согласно комментарию о std :: vector, я использую простые массивы, потому что код очень параллельный, и я ожидаю переместить часть его в CUDA от NVidia. CUDA в настоящее время не поддерживает C ++, только C. Кроме того (хотя это и не так важно) я чувствую себя достаточно свободно, работая с динамическими массивами и явно освобождая память после ... плюс производительность является большим приоритетом. Я использовал std :: vector и smart / auto ptrs в местах, которые мне показались подходящими.

Согласно комментарию о неявном этом, да, вы, вероятно, правы ... Я не уверен, что я думал, когда я сделал это явным. Вот код сериализации, который находится в классе objectArray:

template [class Archive] // заметьте, что для этого поста нужно было сменить браслет

void serialize (Archive & ar, const unsigned int version) {

// только сохранять / загружать имя_А для новых архивов

// if (версия> 0)

// ar & A_name;

ar & PatternsMap;

} * * тысяча двадцать-один

void store (objectArray s, const char имя файла) {

// create and open a character archive for output
std::ofstream ofs(filename);
boost::archive::text_oarchive oa(ofs);
// write class instance to archive
oa << s;
// archive and stream closed when destructors are called

}

void load (objectArray s, const char имя файла) {

std::ifstream ifs(filename);
boost::archive::text_iarchive ia(ifs);
// read class state from archive
ia >> s;
// archive and stream closed when destructors are called

}

0 голосов
/ 29 октября 2009

Предпочитаете использовать std :: vector или Boost.Array вместо простого массива, у вас будет меньше проблем с памятью ... и они фактически по умолчанию создают объекты, которые они содержат, так что это сохранит некоторые строки кода.

Я полагаю, что load - это метод objectArray, и мне интересно, почему вы на самом деле так его называете:

pNA[ii]->load(pNA[ii], "../release/NA Data/NAData_a description_NA0");

Я имею в виду, что при использовании метода у вас уже есть неявный параметр (this), который ссылается на объект, нет необходимости действительно передавать его дважды (один раз как неявный и один раз как явный).

Теперь, конечно, если бы мы могли взглянуть на метод load, это было бы полезно. Довольно сложно диагностировать проблему типа:

Мой метод foo терпит неудачу, вы знаете, почему?

Чем точнее ВЫ, тем больше вероятность, что кто-то точно определит вашу проблему.

...