繁体   English   中英

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

[英]Is there memory leak if function returns std::vector<std::string>?

根据参考: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?
}

通常,按值传递和返回可以避免内存泄漏,尽管当然,所涉及的类型可能仍存在错误的内存管理。 对于标准库容器和std::string ,情况并非如此。

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

您正在尝试将临时绑定到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();

现场例子

签名

void main()

即使像Brian所说的那样,MSVC也可能接受它也是错误的。 标准签名是

int main()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM