2013-08-15 2 views
-5
struct SomeStruct 
{ 
}; 

class C 
{ 
public: 

    C() 
    { 
     for (int i = 0; i < 100; ++i) 
     { 
      m_List.push_back(new SomeStruct); 
     } 
    } 

private: 

    std::list<SomeStruct*> m_List; 
}; 

Какой из двух вариантов деструктора быстрее (почему?) Для освобождения памяти:станд :: Список стирании (свободная память)

~C() 
{ 
    for (auto iter = m_List.begin(); iter != m_List.end(); ++iter) 
    { 
     delete *iter; 
    } 
} 


~C() 
{ 
    while (m_List.size() != 0) 
    { 
     delete *m_List.begin(); 

     m_List.pop_front(); 
    } 
} 
+2

Эти исходные указатели очень проблематичны. Я бы предложил просто «SomeStruct», пока не доказал, что вам нужен указатель, а затем используйте умный указатель. – chris

+0

ребята! почему вниз вниз? – Edward83

+0

chris, я знаю о умных указателях, этот вопрос не о том, как хранить указатели, я только хочу, чтобы вы выбрали одного из деструкторов и объяснили, почему вы его выбираете. – Edward83

ответ

1

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

+0

Первый из них также (неявно) стирает все элементы списка. Какие у вас есть доказательства, что это будет быстрее, чем делать это явно? –

+1

Итерация списка дважды повышает нагрузку на пропускную способность кеша/памяти вашего процессора. Кроме того, просто интересно, не возможно ли, чтобы соответствующая реализация имела O (n) реализацию 'size()'? –

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

  • Нет связанных вопросов^_^