我什么时候应该删除正则表达式迭代器中从 std::smatch 返回的 std::string(如果有的话)?
When should I delete the std::string returned from std::smatch inside a regex iterator, if at all?
我是 C++ 的新手,我一直在研究它的标准正则表达式库。我根据以下参考制作了这个概念验证搜索功能。
https://en.cppreference.com/w/cpp/regex/regex_iterator
这段代码编译正常并按预期运行,但回想起来,有几个地方我担心可能会导致内存泄漏。
您如何处理来自库调用的字符串 return 值?您是否将它们复制到由 new
创建的您自己的字符串对象中?还是您将它们视为值而从不担心内存分配?
我知道 make_unique
和 make_shared
是很好的选择,但我不太习惯使用它们,因为我对 c++ 内存管理结构(如调用析构函数的位置等)的理解仍然存在摇摇欲坠。
#include <iostream>
#include <string>
#include <regex>
#include <vector>
//a proof of concept function that returns regex match strings
std::vector<std::string> return_matches(std::string str){
std::regex reg("[0-9]+");
std::vector<std::string> result;
auto i = std::sregex_iterator(str.begin(), str.end(), reg);
auto str_end = std::sregex_iterator();
for(i; i != str_end; ++i ){
std::smatch match = *i;
result.push_back(match.str());
//string returned from match.str() will be shallow copied into the result array
//but at the same time, the string seems like to be going out of the scope,
//does that mean its destructor is called and its internal (heap) memory
//gets freed?
}
return result;
//Same thing here, will the destructor be called for the vector object,
//leading to a memory leak
}
int main(){
std::string input = "hello 123 afsdha 554 asda 12 721";
auto result = return_matches(input);
//printing the result
for(int i = 0; i < result.size(); i++){
std::cout << result[i] << std::endl;
}
}
When should I delete the std::string returned from std::smatch inside a regex iterator, if at all?
你只删除指针。更具体地说,您删除了由(非放置)new
表达式 return 编辑的指针。
match.str()
不是 return 指针。它 return 是 std::string
的一个实例。您不需要,也不能删除 std::string
对象。
How do you handle a string return value from a library call?
这是一个临时对象。无论您如何处理它,临时对象都会自动销毁。没有内存泄漏的风险。
Do you copy them to your own string ...
当然可以,如果您想存储字符串以备后用。
... that's created by new?
没有。那就是内存泄漏。几乎不需要使用 new
,甚至很少需要使用 new
来创建 std::string
实例。
Or do you treat them like values and never worry about memory allocation?
是的。将值视为值。
//does that mean its destructor is called
是的。临时对象在包含它的完整表达式末尾被销毁。
//and its internal (heap) memory gets freed?
如果 std::string
分配了任何内存,它会负责释放它。
//Same thing here, will the destructor be called for the vector object,
是的,具有自动存储持续时间的对象会在声明它们的范围结束时自动销毁。
//leading to a memory leak
否;恰恰相反。由于析构函数释放了内存,因此没有泄漏。
我是 C++ 的新手,我一直在研究它的标准正则表达式库。我根据以下参考制作了这个概念验证搜索功能。
https://en.cppreference.com/w/cpp/regex/regex_iterator
这段代码编译正常并按预期运行,但回想起来,有几个地方我担心可能会导致内存泄漏。
您如何处理来自库调用的字符串 return 值?您是否将它们复制到由 new
创建的您自己的字符串对象中?还是您将它们视为值而从不担心内存分配?
我知道 make_unique
和 make_shared
是很好的选择,但我不太习惯使用它们,因为我对 c++ 内存管理结构(如调用析构函数的位置等)的理解仍然存在摇摇欲坠。
#include <iostream>
#include <string>
#include <regex>
#include <vector>
//a proof of concept function that returns regex match strings
std::vector<std::string> return_matches(std::string str){
std::regex reg("[0-9]+");
std::vector<std::string> result;
auto i = std::sregex_iterator(str.begin(), str.end(), reg);
auto str_end = std::sregex_iterator();
for(i; i != str_end; ++i ){
std::smatch match = *i;
result.push_back(match.str());
//string returned from match.str() will be shallow copied into the result array
//but at the same time, the string seems like to be going out of the scope,
//does that mean its destructor is called and its internal (heap) memory
//gets freed?
}
return result;
//Same thing here, will the destructor be called for the vector object,
//leading to a memory leak
}
int main(){
std::string input = "hello 123 afsdha 554 asda 12 721";
auto result = return_matches(input);
//printing the result
for(int i = 0; i < result.size(); i++){
std::cout << result[i] << std::endl;
}
}
When should I delete the std::string returned from std::smatch inside a regex iterator, if at all?
你只删除指针。更具体地说,您删除了由(非放置)new
表达式 return 编辑的指针。
match.str()
不是 return 指针。它 return 是 std::string
的一个实例。您不需要,也不能删除 std::string
对象。
How do you handle a string return value from a library call?
这是一个临时对象。无论您如何处理它,临时对象都会自动销毁。没有内存泄漏的风险。
Do you copy them to your own string ...
当然可以,如果您想存储字符串以备后用。
... that's created by new?
没有。那就是内存泄漏。几乎不需要使用 new
,甚至很少需要使用 new
来创建 std::string
实例。
Or do you treat them like values and never worry about memory allocation?
是的。将值视为值。
//does that mean its destructor is called
是的。临时对象在包含它的完整表达式末尾被销毁。
//and its internal (heap) memory gets freed?
如果 std::string
分配了任何内存,它会负责释放它。
//Same thing here, will the destructor be called for the vector object,
是的,具有自动存储持续时间的对象会在声明它们的范围结束时自动销毁。
//leading to a memory leak
否;恰恰相反。由于析构函数释放了内存,因此没有泄漏。