C++ 带数据交换的向量指针

C++ 带数据交换的向量指针,c++,pointers,memory-leaks,new-operator,stdvector,C++,Pointers,Memory Leaks,New Operator,Stdvector,在下面的代码部分中,交换后的内存结构是什么?是否会因为他们在下面交换了内存地址而导致泄漏?因为他们做了一个深度复制会好吗?如果这段代码被困在一个类中,而我正在用一段动态内存交换一个工作缓冲区,会怎么样 #include <iostream> #include <vector> int main() { std::vector<std::string> * ptr_str_vec = new std::vector<std::st

在下面的代码部分中,交换后的内存结构是什么?是否会因为他们在下面交换了内存地址而导致泄漏?因为他们做了一个深度复制会好吗?如果这段代码被困在一个类中,而我正在用一段动态内存交换一个工作缓冲区,会怎么样

#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;
}
#包括
#包括
int main()
{
标准::向量*ptr_str_向量=
新的std::vector();
ptr_str_vec->push_back(“你好”);
std::vector str_vec;
str_vec.push_back(“世界”);
ptr_stru_vec->swap(str_vec);
删除ptr_str_vec;
//由此产生的结构是什么?
返回0;
}

编辑:发布轻微错误的代码。修复了错误。

每个向量中的值将被交换


我看不到内存泄漏(除了程序在main末尾结束时出现的泄漏,因为您没有删除指针),ptr_str_vec指针没有改变,只有它指向的向量内的数据在创建向量时改变,vector使用的底层连续数据块默认情况下是从堆创建的。在您的情况下,因为您没有提供分配器,所以使用默认的分配器

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
}
intmain()
{
标准::向量*ptr_str_向量=
新的std::vector();//#^&!*ptr_str_vec是从堆分配的。vector的数据块是从堆分配的。
ptr_str_vec->push_back(“Hello”)//#^&!“Hello”被复制到堆块#1上
std::vector str_vec;//#^&!str_vec是从堆栈分配的。vector的数据块是从堆分配的。
str_vec.push_back(“World”);/#^&!“World”被复制到堆块#2上
ptr_str_vec->swap(str_vec);/#^&!swap是快速的O(1),因为它是通过交换块#1和#2的地址来完成的。在交换过程中不进行数据复制。
删除ptr_str_vec;//#^&!删除ptr_str_vec以及堆块#2。
//由此产生的结构是什么/
返回0;/#^&!删除str#u vec以及堆块#1
}

假设您已经熟悉,是否有任何原因您没有设置它,以便您可以自己测试输出以了解它的功能?这将是最快的方式,以确保你自己确切地知道它在做什么,如果你使用它是适当的


在这种情况下,生成的结构只是
ptr\u str\u vec
指向包含
std::string(“World”)
的向量,
str\u vec
是包含
std::string(“Hello”)
的向量。您的示例在回答您的问题时存在许多错误,特别是因为每个向量中只有一个元素(因此向量的长度相等),而且元素的大小完全相同(因此向量占用大致相等的内存段)。在整个项目的运行实例中,很可能这些条件都不正确。

存在泄漏,因为您
new
编辑了一些内容,但没有调用
delete
。假设ptr\u stru\u vec被删除,是否仍然存在泄漏?显然,您在调试器下尝试了这一点,并自己看到了答案。真正的问题是什么?
vector::swap
交换向量的内容;代码中不存在交换向量地址的情况。不,不会有泄漏。这完全受新操作符的影响吗?我忘记了分配器使用堆。非常感谢。