c++ - 将 unique_ptr 传递给 strtok

标签 c++ c c++11

我遇到了遗留代码的问题。遗留代码使用 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/

相关文章:

c - 添加printf change sendTo result from failure to success

c++ - 尝试将整数强制转换为 void 以按值传递给 pthread 函数

c - 将输入发送到 C 程序并打印它们

具有更新/验证循环的 C++ FLTK 的 Fl_Input 数据

c++ - 神经网络为不同的输入提供相同的输出,不学习

c++ - 无效 C 风格强制转换后的方法调用

c++ - 仅使用按位运算符复制 for 循环的功能

c++ - 尝试发送 GET 请求,同一地址收到 301

c++ - 使用 std::function 参数重载函数:为什么从未调用 const 方法?

c++ - C++获取unicode字符的CodePoint