带数据交换的std :: vector指针

时间:2013-07-17 19:44:16

标签: c++ pointers memory-leaks new-operator stdvector

在下面的代码部分中,交换后的结果内存结构是什么?是否存在泄漏,因为他们已经交换了下面的内存地址?会不会因为他们做了很深的复制?如果这段代码被卡在一个类中并且我正在用一块动态内存交换一个工作缓冲区怎么办?

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

编辑:发布略有错误的代码。修正了错误。

3 个答案:

答案 0 :(得分:3)

创建向量时,向量使用的基础连续数据块默认是从堆创建的。在您的情况下,由于您没有提供分配器,因此使用默认分配器。

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
}

答案 1 :(得分:0)

每个向量中的值将被交换http://www.cplusplus.com/reference/vector/vector/swap/

我看到没有内存泄漏(除了你的程序在main结束时得到的那个,因为你没有删除你的指针),你的ptr_str_vec指针不会改变,只有向量内的数据就是它指向变化

答案 2 :(得分:0)

假设您已经熟悉swap,是否有任何理由没有设置它,以便您可以测试输出以查看它自己做了什么?这将是确保您确切知道它正在做什么以及您是否适当使用它的最快方式。

在这种情况下,生成的结构只是ptr_str_vec指向包含std::string("World")的向量,而str_vec是包含std::string("Hello")的向量。你的例子在回答你的问题时会遇到很多错误,特别是因为你在每个向量中只有一个元素(因此向量长度相等),并且因为元素的大小完全相同(因此向量占据的大致相当)记忆段)。在整个项目的运行实例中,很可能没有一个条件成立。