vector :: erase () также стирает векторы-члены структуры - PullRequest
2 голосов
/ 29 декабря 2011

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

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

#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);

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

Ответы [ 4 ]

4 голосов
/ 29 декабря 2011

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

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

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

2 голосов
/ 29 декабря 2011

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

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

1 голос
/ 29 декабря 2011

Ответ: Поскольку вы не размещаете объект динамически с помощью оператора 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 голосов
/ 30 декабря 2011

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

This:

#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;
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...