我正面临遗留代码的问题。遗留代码使用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
函数内被修改了吗?
提前致谢。
答案 0 :(得分:4)
将unique_ptr
传递给函数表示该内存的所有权转移到该函数。在某种程度上,这就是strtok
所做的那样,因为它会将该指针保持在该函数的执行之外。但由于它是一个C函数,它无法在其界面中有效地表示它。
您需要做的就是现在正在做的事情:管理 strtok
的内存。只要您的代码需要unique_ptr
才能访问它,您需要保持strtok
有效。在前面的代码中,它是堆栈内存。在您的代码中,它是堆栈对象拥有的堆内存。无论哪种方式,内存所有权语义都有效。
除非原始代码被破坏(即:某人在数组范围之外调用strtok
且NULL
)。在这种情况下,您的新代码将以相同的方式被破坏。虽然很可能,它会更明显地破裂。
答案 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_ptr
和strcpy()
:
std::string record = inputString; // make a copy, if you cannot modify inputString, or pass inputString itself
token = strtok(record.data(), DELIMETER);
在这种情况下,您只需要以相同的方式维护变量record
的生命周期,但您不需要处理strcpy()
和内存分配。