У меня есть программа на C++, как показано ниже. Я пытаюсь передать std :: list из одной функции в другую по значению. Я ожидаю, что список будет доступен в функции вызывающего абонента с помощью итератора? Я ожидаю, что возврат вызовет конструктор копирования std::list
, и он будет доступен в вызывающем. Я ошибаюсь в своем предположении? Если нет, то почему я получаю ошибку сегментации.Передача std :: list из одной функции в другую по значению
#include <list>
#include <map>
#include <string>
#include <set>
#include <iterator>
#include <iostream>
const char *sy_path = "/var/log";
struct Setting
{
typedef std::list<const Setting*> List;
const char* path;
const char* filename;
const char* name;
int def;
int min;
int max;
struct Original
{
const char* filename;
const char* name;
Original(const char* filename_, const char* name_)
:filename(filename_), name(name_)
{
}
}original;
static const List settings();
};
const Setting::List Setting::settings()
{
const Setting c_settings[] =
{ //default min max
{ sy_path, "cs.cfg", "num_a", 1, 1, 29, Original("sys.cfg", "num_a") }
,{ sy_path, "cs.cfg", "num_b", 1, 1, 6, Original("sys.cfg", "num_b") }
,{ sy_path, "cs.cfg", "num_c", 1, 1, 29, Original("sys.cfg", "num_c") }
};
Setting::List lst;
int numelem = sizeof(c_settings)/sizeof(Setting);
for (int i = 0; i < numelem; i++)
{
const Setting & tmpSetting = c_settings[i];
lst.push_back(&tmpSetting);
}
return lst;
}
static int get_settings(void)
{
Setting::List lst;
lst = Setting::settings();
for (Setting::List::const_iterator it = lst.begin() ; it != lst.end(); ++it)
{
const Setting *cs = *it;
std::cout << "path: " <<cs->path << "filename: " <<cs->filename << "name: " << cs->name << std::endl;
}
}
int main()
{
get_settings();
return 0;
}
Вы возвращаете список указателей на данные, которые уже давно разрушены, прежде чем вы выполните его в 'get_settings'. Попробуйте вместо этого изменить список на 'std :: list'. –
fbrereto
Почему, почему, почему? Не проблема, но почему многие люди пишут назначения вместо инициализации? 'Setting :: List lst; lst = Setting :: settings(); 'должно быть' Setting :: List lst = Setting :: settings(); '. Нет причин создавать объект List и немедленно выбросить его. –