我遇到了遗留代码的问题。遗留代码使用 char
大小为 1024
的数组并被传递给 strtok
c 函数。
char record[1024] = { '\0' };
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);
我的问题是,我可以通过 unique_ptr
吗?至 strtok
用作record
变量在 strtok
中被修改功能?
提前致谢。
最佳答案
将unique_ptr
传递给函数表示将该内存的所有权转移 给该函数。在某种程度上,这就是 strtok
所做的,因为它会在该函数执行之后保留该指针。但由于它是一个 C 函数,它无法在其接口(interface)中有效地表示它。
你要做的就是你现在正在做的: strtok
管理内存。只要您的代码需要 strtok
才能访问它,您就需要让 unique_ptr
保持事件状态。在前面的代码中,它是堆栈内存。在您的代码中,它是堆栈对象拥有的堆内存。无论哪种方式,内存所有权语义都有效。
除非原始代码被破坏(即:有人调用 strtok
并在数组范围之外使用 NULL
)。在这种情况下,您的新代码将以相同的方式被破坏。虽然有可能,但它会更明显地破裂。
关于c++ - 将 unique_ptr 传递给 strtok,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46120564/