2015-05-20 3 views
1

Я новичок в C++ и реализованы следующие struct:Освобождает память указателя на структуру

struct Person { 
    String name; 
    int age; 
}; 

Теперь я создаю новый объект:

Person *p = new Person(); 
p->name = "name"; 
p->age = 211; 

и push его на stack :

stack.push(*p); 

У меня есть while(!stack.empty()), и там я обрабатываю каждый элемент, который я вставлял в стек.
Теперь, где я могу освободить память? В while -loop я сделать следующее:

Person *current = &stack.front(); 
stack.pop(); 
// do stuff 
delete current; 

К сожалению, delete current заявление бросает своего рода исключение.

Что делать неправильно? Спасибо за вашу помощь.

+1

Используйте 'std :: uniqur_ptr' или' std :: shared_ptr', и он будет удален для вас автоматически. –

+1

@CaptainObvlious Не большой совет, если нет причин для динамического распределения. – juanchopanza

+0

Вы нажимаете значения в контейнере 'stack', но затем угрожаете им как указатели на объекты из кучи. Затем попытка удалить объект из стека программы (не путать с контейнером 'stack') приводит к сбою программы. –

ответ

8

После нажатия в стеке вам понадобится delete p. Стек хранит собственную копию объекта, вложенного в нее, поэтому после всплытия ничего не нужно делать.

Но реальное решение не использовать new в первую очередь:

Person p = {"name", 211}; 
... 
stack.push(p); 

или просто

stack.push(Person{"name", 211}); 

Тогда

Person current = stack.front(); 
stack.pop(); 

Таким образом, нет необходимости иметь дело непосредственно с управление памятью.

+0

В стеке хранится собственная копия объекта, вложенного в него в память 'Stack', верно? Что мне делать, если у меня недостаточно памяти 'Stack', так как я нажимаю много объектов, около 40 000 000' Person'? – optional

+1

@optional Вероятно, вы получите исключение 'std :: bad_alloc'. – juanchopanza

4

Когда вы нажимаете что-то в стек, вы не нажимаете оригинальный объект - вы нажимаете копию объекта. Чтобы освободить память исходного объекта, вам нужно сделать это прямо на том месте, после того как вы его нажали.

Или вы можете пропустить, что вообще и не использовать new для создания объекта в первую очередь:

Person p; 
p.name = "name"; 
p.age = 211; 
stack.push(p); 
0

Вам не нужно, чтобы указатель. Если вам нужно, то с помощью умного указателя для освобождения памяти для вас:
std::unique_ptr<Person> p(new Person);

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