在程序中使用cout
时,出现一些奇怪的行为,类似于以下内容:
...
char *input = realpath(argv[1], NULL);
char *output = argv[2];
char *tarout = new char[strlen(output)+6];
strcpy(tarout, output);
strcat(tarout, ".temp");
cout << "Tarout: " << tarout << endl;
int tRet = tarball(input, tarout);
if(tRet != 1) {
cerr << "Error: Could not compress directory!\nHalting package creation!" << endl;
return 0;
}
int gRet = gzip(tarout, output);
if(gRet != 1) {
cerr << "Error: Could not compress directory!\nHalting package creation!" << endl;
return 0;
} else {
cout << "TAROUT: " << tarout << endl;
if((remove(tarout))!=0) {
cerr << "Warning: Could not delete temporary file!" << endl;
return 0;
}
}
...
基本上,此程序创建一个tar文件,然后使用gzip对其进行压缩,这不是100%的实际代码,因此它可能不会产生与我收到的相同的奇怪行为。
如果删除了第一个
cout << "TAROUT: " << tarout << endl;
,第二个cout << "TAROUT: " << tarout << endl;
将不返回任何内容,并且临时文件也不会被删除,这是为什么呢? 最佳答案
new / malloc不会初始化内存,因此我可以肯定的是,在tarout的末尾没有NULL终止符。
我怀疑您是通过调试器运行原始代码还是只是打印出*(tarout + 5),您会发现那里没有'0'。
鉴于您的意见重新使用了std :: string,我将这样写:
const char * file_ext = ".temp";
// no magic numbers...and an obvious + 1 for null terminator
size_t len = strlen(output)+strlen(file_ext)+1;
char *tarout = new char[len];
memset(tarout, 0, len);
strcpy(tarout, output);
strcat(tarout, file_ext);
// If you feel memset is wasteful, you can use
*(tarout+len-1) = 0;
...
关于c++ - C++中奇怪的cout行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5053408/