2015-07-20 2 views
-1

Объясните, пожалуйста, следующие вещи.Имеет ли смысл использовать «новое» при создании std :: set?

#include <iostream> 
#include <set> 

int main() { 
    std::set<int>* a = new std::set<int>; 

    a->insert(2); 
    a->insert(5); 

    for (std::set<int>::iterator it = a->begin(); it != a->end(); it++) { 
     std::cout << *it << std::endl; 
    } 

    std::cout << "Deleting a....." << std::endl; 

    delete a; 

    for (std::set<int>::iterator it = a->begin(); it != a->end(); it++) { 
     std::cout << *it << std::endl; 
    } 


    return 0; 
} 

$ g++ test6.cpp && a 
2 
5 
Deleting a..... 
2 
5 
3544585 
  1. Есть ли какой-либо смысл использовать оператор новый создания станд :: установить? Как я читал в руководствах, std :: set имеет свой собственный объект Allocator, который отвечает за распределение динамической памяти с помощью оператора . Но интересно познакомиться с опытными членами.
  2. Почему после освобождения памяти с помощью удалить членов станда :: набора все еще имеющийся и имеет значение 2 и 5, как перед тем удалить. И какой правильный способ удалить член a. Спасибо.
+0

В этом случае он не является полностью ненужным. – CoryKramer

+1

[Выделение указателя, который был удален, является неопределенным поведением.] (Http://stackoverflow.com/a/2896267/2721883) – clcto

+0

http://stackoverflow.com/a/6445794/2756719 обращается к аналогичной ситуации. –

ответ

1

Нет, стандартная библиотека имеет функциональные возможности управления памятью, поэтому программисту не нужно беспокоиться об этом.

Причина, по которой вы все еще видите разумные значения, выводимые после delete, заключается в том, что ваш компьютер еще не записал новые значения по пространствам памяти. Вот почему попытка доступа к памяти после ее удаления находится под зонтиком «неопределенного поведения».

+0

Спасибо всем! – yozhik

2

Часы this part разговоров Stroudstrup по адресу Going Native 2013

1) Нет, вы можете просто создать локальную переменную a, и пусть он будет выпущен в конце функции через нормальный поток управления

std::set<int> a; 
a.insert(2); 
a.insert(5); 

2) Вам повезет. Неопределенное поведение для доступа к выпущенной памяти. Запустите этот код через valgrind, и вы увидите ошибки.

int *ip = new int{1}; 
delete ip; 
int a = *ip; // NOT SAFE, maybe 1, maybe 24630751, maybe crash 
+3

Вы провалили «неудачу». –

+0

Спасибо всем! – yozhik