2011-12-29 2 views
2

Люди, я новичок во всем этом разговоре по программированию. До сих пор было довольно легко найти ответы, отправляя их в Google, но прямо здесь у меня большие проблемы с выражением того, что я хочу задать, позвольте мне попробовать: стирание вектора вызывает деструктор, прежде чем освободить память, не так ли? Теперь как реагирует структурный вектор, если он разрушен? Один не определяет деструктор для этих вещей, но правильно ли предположить, что если структура «разрушена», каждый из деструкторов ее членов также будет вызван?vector :: erase() также стирает член-векторы структуры

Позвольте мне дать вам пример:

#include <string> 
#include <vector> 
struct ding_t { 
    std::string dang; 
} foo; 

strung boom_t { 
    vector <ding_t> chuck; 
} bar; 

int main() { 
    vector <boom_t> tom; 
    tom.resize(10); 
    tom[4].chuck.resize(5); 
    tom[4].chuck[3].dang = "jerry"; 
    tom.erase(); 

    return 0; 
} 

в этом случае, будет память, выделенную

tom[4].chuck.resize(5); 

быть освобожден, а? Извините за мой словарный запас, но в данный момент я пытаюсь перейти от указателей к более сложному языку, эквивалентному векторам. Надеюсь, у меня есть точка. Спасибо заранее, ребята, и, пожалуйста, просто перенаправьте меня, если это уже было задано, как я уже сказал, я не знаю, как ограничить этот вопрос.

+0

Добавление тега для языка, в котором вы работаете, привлечет вас больше внимания. Извините, я не могу ответить на ваш вопрос. + 1'd – vdbuilder

ответ

4

Да, память будет автоматически освобождена.

Когда вектор разрушен, он вызовет деструктор всех содержащихся в нем элементов. Вы не определили деструктор для своего struct, поэтому компилятор предоставит вам по умолчанию (что ничего не делает).

Однако, если ваш вектор содержит указатели на объекты будет вашей ответственности вызывать деструктор на объектах до разрушающего вектора (так как вектор будет вызывать деструктор из указателей, а не заостренные объектов), если у вас нет другого способа доступа к ним позже.

2

См. http://www.parashift.com/c++-faq-lite/dtors.html#faq-11.11 для ответа на ваш вопрос и всю статью за очень хорошее обращение с деструкторами на C++.

Что касается Вашего второго вопроса: да, память, выделенная tom[4].chuck.resize(5); получит освободила, а также, так как он несет ответственность векторных «S управлять своим собственным распределением памяти (что имеет место для«размера() «call.)

+0

Ах, знаменитый вопрос cpp, я не думал об этом. Всем спасибо. Это было действительно полезно. Теперь, когда я думаю об этом, я мог бы также изменить размер и стереть его в цикле и проверить, увеличивается ли его использование памяти с течением времени. –

1

Ответ: Поскольку вы не распределяете объект динамически с помощью оператора new, вам не нужно его освобождать вручную. Это делается автоматически для вас.

Хорошо. Вернуться к вашему коду :)

Если вы хотите удалить 6-й элемент, используйте tom.erase (tom.begin()+5).

И если вы хотите удалить все элементы, используйте tom.erase (tom.begin(),tom.end()).

Чтобы стереть первые 3 элемента, используйте tom.erase (tom.begin(),tom.begin()+3).

#include <string> 
#include <vector> 
using namespace std; 

struct ding_t 
{ 
    std::string dang; 
} foo; 

struct boom_t { 
    std::vector <ding_t> chuck; 
} bar; 

int main() { 
    vector <boom_t> tom; 
    tom.resize(10); 
    tom[4].chuck.resize(5); 
    tom[4].chuck[3].dang = "jerry"; 

    //error C2661: 'erase' : no overloaded function takes 0 parameters 
    //tom.erase(); 

    // erase the 6th element 
    tom.erase (tom.begin()+5); 

    // erase the first 3 elements: 
    //tom.erase (tom.begin(),tom.begin()+3); 

    // erase everything: 
    //tom.erase (tom.begin(),tom.end()); 

    return 0; 
} 
0

Хорошо, я сделал небольшую проверку, просто чтобы убедиться. (Почему я не подумал об этом раньше ... вчера было совсем поздно ...) Исходный код был плохо написан и не работал, извинившись за это.

Это:

#include <string> 
#include <vector> 

struct ding_t { 
    std::string dang; 
} foo; 

struct boom_t { 
    std::vector <ding_t> chuck; 
} bar; 

int main() { 
    std::vector <boom_t> tom; 

    while (true) { 
     tom.resize(10); 
     tom[4].chuck.resize(5); 
     tom[4].chuck[3].dang = "jerry"; 
     tom.erase(tom.begin(), tom.end()); 
    } 

    return 0; 
} 

вызывает никаких памяти не утечка, используемая память стабильна.

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