2013-07-17 3 views
1

В разделе кода ниже, какова будет структура памяти после обмена? Будет ли утечка, потому что они поменяли местами адрес памяти? Было бы хорошо, потому что они сделали глубокую копию? что, если этот код застрял внутри класса, и я менял рабочий буфер с куском динамической памяти?std :: векторный указатель с обменом данными

#include <iostream> 
#include <vector> 

int main() 
{ 
    std::vector<std::string> * ptr_str_vec = 
     new std::vector<std::string>(); 
    ptr_str_vec->push_back("Hello"); 

    std::vector<std::string> str_vec; 
    str_vec.push_back("World"); 

    ptr_str_vec->swap(str_vec); 

    delete ptr_str_vec; 
    //What would be the resulting structures? 

    return 0; 
} 

РЕДАКТИРОВАТЬ: Отмечено немного неисправного кода. Исправлены ошибки.

+0

Существует утечка, потому что вы «что-то новое» и не вызывали 'delete'. – juanchopanza

+0

Предполагая, что существует удаление для ptr_str_vec, есть ли еще утечка? – MagikWorx

+0

Вы, очевидно, пробовали это под отладчиком и сами видели ответ. Каков реальный вопрос? –

ответ

2

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

int main() 
{ 
    std::vector<std::string> * ptr_str_vec = 
     new std::vector<std::string>(); // #^&! *ptr_str_vec is allocated from heap. vector's data block is allocated from heap. 
    ptr_str_vec->push_back("Hello"); // #^&! "hello" is copied onto heap block #1 

    std::vector<std::string> str_vec; // #^&! str_vec is allocated from stack. vector's data block is allocated from heap. 
    str_vec.push_back("World");   // #^&! "world" is copied onto heap block #2 

    ptr_str_vec->swap(str_vec);   // #^&! swap is fast O(1), as it is done by swapping block #1 and #2's address. No data copy is done during swap. 

    delete ptr_str_vec;     // #^&! delete ptr_str_vec as well as heap block #2. 
    //What would be the resulting structures?/

    return 0;       // #^&! delete str_vec as well as heap block #1 
} 
+0

Я забыл о распределителях, используя кучу. Спасибо. – MagikWorx

0

Значения каждого вектора будут обменены http://www.cplusplus.com/reference/vector/vector/swap/

Я не вижу никакой утечки памяти (кроме того, вы получите, когда ваша программа заканчивается в конце основной, так как вы не удалите указатель), ваш Указатель ptr_str_vec не изменяется, только данные внутри вектора, которые он указывает на изменения

+0

От этого зависит новый оператор? – MagikWorx

+1

Конечно нет. Почему? –

0

Предположим, что вы уже знакомы с swap, есть ли причина, по которой вы не установили его так, вы можете проверить выход посмотреть, что он делает себя? Это будет самый быстрый способ заверить себя, что вы точно знаете, что он делает, и если ваше использование этого уместно.

В этом случае полученные структуры являются просто, что указывает на ptr_str_vec вектором, содержащим std::string("World") и str_vec представляет собой вектор, содержащий std::string("Hello"). Ваш пример страдает от многих ошибок при ответе на ваш вопрос, в частности, потому что у вас есть только один элемент в каждом векторе (и, следовательно, векторы равны по длине) и потому, что элементы имеют одинаковый размер (и, следовательно, векторы занимают примерно эквивалентные сегменты памяти). В запущенном экземпляре вашего полного проекта очень вероятно, что ни одно из этих условий не будет истинным.

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