将unique_ptr传递给斯特托克

Passing unique_ptr to strtok

本文关键字:unique ptr      更新时间:2023-10-16

我遇到了遗留代码的问题。旧代码使用大小为1024char数组,并传递给 c 函数strtok

char record[1024] = { '' };
char *token = NULL;
strcpy(record, inputString);// 'inputString' very large string.
token = strtok(record, DELIMETER);

现在由于新的要求,我必须将大小修改为 20000 字节,并且在许多地方他们已经声明了这种类型的 (record) 的局部变量。

现在我们正在使用 C++11 编译器编译代码,由于我们使用的是 C++11 编译器,我计划将char数组修改为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);

我的问题是,当record变量在strtok函数中被修改时,我可以将unique_ptr传递给strtok函数吗?

提前谢谢。

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

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

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

我的问题是,当记录变量在 strtok 函数内部被修改时,我可以将unique_ptr传递给 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()和内存分配。