function returns std::vector<std::string>是否有内存泄漏?
Is there memory leak if function returns std::vector<std::string>?
根据参考:
1. std::vector::swap交流内容;
2.复制字符串很深
但是如何交换函数返回的字符串数组呢?
我的猜测是,函数 returns 内部字符串的副本。所以交换应该没问题。但是,在 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)
.] 来编译它。] 交换两个向量不会复制或移动向量的元素。您可以想象这两个向量指向其内部数据数组的指针被简单地交换,将对象本身留在原地。
您的代码无法编译,因为您正在尝试将临时值绑定到左值引用
template <class T> void swap (T& a, T& b)
MSVC 似乎接受它并交换内容(它不复制内容)但这不符合要求。它不应该泄漏(它交换内部内容,而不是复制内容)但它也不应该那样工作。
假设在您的情况下同时使用符合 C++11 的编译器和标准库,您最好依赖编译器做出正确的选择:即返回 std::vector<std::string>
确实是临时的并且受制于移动语义。不会涉及内存泄漏,因为您使用的向量(当然假设在实现中没有错误)提供 move operators/constructors.
std::vector<std::string> list;
list = get_name_list();
签名
void main()
也是错误的,尽管正如 Brian 评论的那样,MSVC 可能会接受它。标准签名是
int main()
根据参考:
1. std::vector::swap交流内容;
2.复制字符串很深
但是如何交换函数返回的字符串数组呢?
我的猜测是,函数 returns 内部字符串的副本。所以交换应该没问题。但是,在 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)
.] 来编译它。] 交换两个向量不会复制或移动向量的元素。您可以想象这两个向量指向其内部数据数组的指针被简单地交换,将对象本身留在原地。
您的代码无法编译,因为您正在尝试将临时值绑定到左值引用
template <class T> void swap (T& a, T& b)
MSVC 似乎接受它并交换内容(它不复制内容)但这不符合要求。它不应该泄漏(它交换内部内容,而不是复制内容)但它也不应该那样工作。
假设在您的情况下同时使用符合 C++11 的编译器和标准库,您最好依赖编译器做出正确的选择:即返回 std::vector<std::string>
确实是临时的并且受制于移动语义。不会涉及内存泄漏,因为您使用的向量(当然假设在实现中没有错误)提供 move operators/constructors.
std::vector<std::string> list;
list = get_name_list();
签名
void main()
也是错误的,尽管正如 Brian 评论的那样,MSVC 可能会接受它。标准签名是
int main()