将unique_ptr传递给strtok

时间:2017-09-08 16:07:36

标签: c++ c c++11

我正面临遗留代码的问题。遗留代码使用public componentWillUnmount() { this.ro.unobserve(this.el); } public componentDidMount() { this.el = ReactDOM.findDOMNode(this.refs.el); this.ro = new ResizeObserver((entries) => { for (let entry of entries) { // set state } }); this.ro.observe(this.el); } 数组,其大小为char,并传递给1024 c函数。

strtok

现在由于新的要求,我必须将大小修改为20000字节,并且在许多地方他们已经声明了这种类型(char record[1024] = { '\0' }; char *token = NULL; strcpy(record, inputString);// 'inputString' very large string. token = strtok(record, DELIMETER); )的局部变量。

现在我们正在使用C ++ 11编译器编译代码,因为我们正在使用C ++ 11编译器,所以我计划将record数组修改为char,如图所示...... < / p>

unique_ptr

我的问题是,我可以将#define MAX_RECORD 50000 auto record = std::make_unique<char[]>(MAX_RECORD * 4); char *token = NULL; strcpy(record.get(), inputString); token = strtok(record.get(), DELIMETER); 传递给unique_ptr函数,因为strtok函数在record函数内被修改了吗?

提前致谢。

2 个答案:

答案 0 :(得分:4)

unique_ptr传递给函数表示该内存的所有权转移到该函数。在某种程度上,这就是strtok所做的那样,因为它会将该指针保持在该函数的执行之外。但由于它是一个C函数,它无法在其界面中有效地表示它。

您需要做的就是现在正在做的事情:管理 strtok的内存。只要您的代码需要unique_ptr才能访问它,您需要保持strtok有效。在前面的代码中,它是堆栈内存。在您的代码中,它是堆栈对象拥有的堆内存。无论哪种方式,内存所有权语义都有效。

除非原始代码被破坏(即:某人在数组范围之外调用strtokNULL)。在这种情况下,您的新代码将以相同的方式被破坏。虽然很可能,它会更明显地破裂。

答案 1 :(得分:1)

  

我的问题是,我可以将unique_ptr传递给strtok函数,因为记录变量在strtok函数中被修改了吗?

要获得正确答案,您需要提出正确的问题。 strtok()修改record变量的声明不正确,它可能会修改record指向的内存,但不能修改变量record本身。那些不同的东西,这在这里很重要。所以回答纠正的问题是否定的,你不能将std::unique_ptr直接传递给strtok(),因为它是C ++对象而strtok()是C函数。但是,是的,您可以传递由std::unique_ptr管理的基础指针,并且您需要将std::unique_ptr对象本身的生命周期保持足够长,以至于它不会破坏该内存的strtok()要求。

关于代码,不清楚为什么你需要std::unique_ptrstrcpy()

std::string record = inputString;  // make a copy, if you cannot modify inputString, or pass inputString itself
token = strtok(record.data(), DELIMETER);

在这种情况下,您只需要以相同的方式维护变量record的生命周期,但您不需要处理strcpy()和内存分配。