2016-05-17 2 views
-2
struct try 
{ 
    int elem; 
    map<int , int *> mymap; 
}; // simple structure containing int and a map 
struct try * var; // pointer to try structure 
var = (struct point *) malloc(sizeof(struct point)); 
var->mymap[1]=(int *)malloc(sizeof(int)); // want to add(1,pointer to integer) 

Показаны неисправности segmenation из последней строкиКак вставить значение на карту, когда оно объявлено в структуре?

+1

Возможно, первая строка должна указывать «struct point» вместо «struct try»? – matiu

+2

также, это C++, а не c; лучше использовать управление памятью C++ вместо malloc. возможно, вам просто нужна карта ; без указателей? – matiu

+1

'struct try' порождает ошибку для меня. Каковы ваши флагов для компилятора и компиляции? – Garf365

ответ

1

Вы должны использовать 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>(); 
+2

Нет, вы не должны использовать 'new'. Это уже не 1990! –

+0

@LightnessRacesinOrbit да, конечно, см. Мое редактирование. Но важно понимать основные основные операции. – Garf365

+0

Поймите их, конечно. Используй их? № –

Смежные вопросы