C++ 为什么在googletest中调用`mkdtemp()`时失败?
我创建了一个小的RAII类,它创建了一个唯一的临时目录,并在销毁时再次删除它。在Linux上,它使用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
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”
后缀后恰好有一个空字节,则这是偶然的。是否是这种情况取决于执行环境。哦,天哪,好主意!所以我在玩记忆体彩票,幸运地得到了独立和表意文字的检查。非常感谢你。