我什么时候应该删除正则表达式迭代器中从 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_uniquemake_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

否;恰恰相反。由于析构函数释放了内存,因此没有泄漏。