Вы должны использовать new
вместо malloc
:
struct point
{
int elem;
map<int , int *> mymap;
}; // simple structure containing int and a map
point * var; // pointer to try structure
var = new point;
var->mymap[1]=new int;
Действительно, new
выделить память и вызвать конструктор. Здесь, с malloc
, которые выделяют только память, конструктор члена mymap
не вызывается, и поэтому mymap
все еще неинициализирован, поэтому вы получаете неопределенное поведение при его использовании.
Не писать C-подобный код при использовании C++ =>new
/delete
вместо malloc
/free
И я думаю, что это может быть хорошая вещь, чтобы добавить деструктор к вашему struct
который удалит оставшиеся указатель в mymap
, чтобы избежать утечек памяти
Наконец, если вы используете C++ 11 или больше, посмотрите на смарт-указатель: std::unique_ptr
, std::shared_ptr
, или для старой версии C++, эквивалентный класс от повышающего смарт-указатель:
struct point
{
int elem;
map<int , std::shared_ptr<int>> mymap;
}; // simple structure containing int and a map
// for c++14 or greater:
auto var = std::make_unique<point>();
//or c++11:
std::unique_ptr<point> var(new point);
// for both
var->mymap[1]=std::make_shared<int>();
Возможно, первая строка должна указывать «struct point» вместо «struct try»? – matiu
также, это C++, а не c; лучше использовать управление памятью C++ вместо malloc. возможно, вам просто нужна карта; без указателей? –
matiu
'struct try' порождает ошибку для меня. Каковы ваши флагов для компилятора и компиляции? – Garf365