如果函数返回std :: vector <std :: string>?</std :: string>,是否存在内存泄漏

时间:2015-04-22 07:17:43

标签: c++ string memory vector swap

根据参考资料: 1. std :: vector :: swap交换内容; 2.复制字符串很深 但是如何交换函数返回的字符串数组呢?

我的猜测是,该函数返回内部字符串的副本。所以交换应该没问题。但是,在visual studio中调试,内部字符串和外部字符串(交换后)在raw_view中具有相同的内存地址,所以我怀疑我的猜测。

谢谢。

std::vector<std::string> get_name_list()
{
    std::string name1 = "foo";
    std::string name2 = "bar";

    std::vector<std::string> names;
    names.push_back(name1);
    names.push_back(name2);
    return names;
}

void main()
{
    std::vector<std::string> list;
    list.swap(get_name_list());    // deep copy strings? or access local memory?
}

2 个答案:

答案 0 :(得分:2)

通常,按值传递和返回可以避免内存泄漏,但是当然所涉及的类型可能仍然存在错误的内存管理。标准库容器和std::string不应该是这种情况。

你的代码中没有内存泄漏[编辑:假设它编译,那就是;您可以通过将其更改为get_name_list().swap(list)来进行编译。]交换两个向量不会复制或移动向量的元素。您可以想象,两个向量指向其内部数据数组的指针只是交换,使对象本身就位。

答案 1 :(得分:0)

您的代码无法编译,因为您尝试将临时绑定到l值引用

template <class T> void swap (T& a, T& b)

MSVC似乎接受它并交换内容(它不会复制内容),但这不符合要求。它不应该泄漏(它交换内部内容,而不是复制内容),但它不应该以这种方式工作。

假设在你的情况下同时使用符合C ++ 11的编译器和标准库,你最好依靠编译器做出正确的选择:即返回std::vector<std::string>确实是一个临时的并受制于移动语义。因为您使用了一个向量(假设在实现中没有错误)提供移动运算符/构造函数,所以不会涉及内存泄漏。

std::vector<std::string> list;
list = get_name_list();

Live Example

签名

void main()

也是错误的,尽管正如Brian评论的那样,MSVC可能会接受它。标准签名是

int main()