C++ 为什么在googletest中调用`mkdtemp()`时失败?

C++ 为什么在googletest中调用`mkdtemp()`时失败?,c++,cross-platform,posix,googletest,C++,Cross Platform,Posix,Googletest,我创建了一个小的RAII类,它创建了一个唯一的临时目录,并在销毁时再次删除它。在Linux上,它使用mkdtemp() //temporaryDirectoryPath是一个std::vector //包含u8“/tmp/nuclex-pixels-unittest-XXXXXX” //让mkdtemp()为我们整理出一个唯一的目录名(并创建它!) const char*directoryName=::mkdtemp(&temporaryDirectoryPath[0]); if(directo

我创建了一个小的RAII类,它创建了一个唯一的临时目录,并在销毁时再次删除它。在Linux上,它使用
mkdtemp()

//temporaryDirectoryPath是一个std::vector
//包含u8“/tmp/nuclex-pixels-unittest-XXXXXX”
//让mkdtemp()为我们整理出一个唯一的目录名(并创建它!)
const char*directoryName=::mkdtemp(&temporaryDirectoryPath[0]);
if(directoryName==nullptr){
perror(“mkdtemp()失败。”);//调试。删除。
抛出std::runtime_错误(“mkdtemp()失败”);
}
这在单独运行时工作正常:


但是,如果我在如下声明的单元测试中使用相同的代码:

TEST(MyTestFixture,CanFlumbleTempDirectory){
临时目录范围临时目录;
//无法在此处调用temporaryDirectory.GetPath()。。。
}
它失败了:

Passing the following to mkdtemp(): /tmp/nuclex-pixels-unittest-XXXXXX
mkdtemp() failed.: Invalid argument

GoogleTest如何干扰
mkdtemp()

传递给
mkdtemp
的字符串没有可靠的空终止:

      // Then append our directory name template to it
      const char directoryNameTemplate[] = u8"nuclex-pixels-unittest-XXXXXX";
      {
        const char *iterator = directoryNameTemplate;
        while(*iterator != 0) {
          temporaryDirectoryPath.push_back(*iterator);
          ++iterator;
        }
      }

std::vector
不执行隐式空终止,这与
std::string
不同。如果
“XXXXXX”
后缀后恰好有一个空字节,则这是偶然的。是否是这种情况取决于执行环境。

哦,天哪,好主意!所以我在玩记忆体彩票,幸运地得到了独立和表意文字的检查。非常感谢你。