在我的代码中,我使用system()调用一个只存在于raspberry pi的shell上的函数,特别是"raspistill“
在执行此操作时,我使用char[]和strcat(),如下所示:
#include <stdlib.h>
int main(int argc, char * argv[]){
if(argc != 2) return -1;
char command[] = "raspistill -o ";
strcat(command, argv[1]);
system(command);
delete[] command;
return 0;
}我收到警告说要删除的长度为15,这是初始化命令时的初始长度,而不是strcat函数之后的新长度。
当我使用带append()的C++字符串时,这个问题就消失了。为什么这会导致断层,我该如何避免呢?
发布于 2015-07-08 17:28:39
您正在尝试在分配了常量字符串文本的strcat上调用char[]。这会失败的。另外,您没有理由使用上述的delete[] command,因为您没有在免费存储上动态地分配它(例如使用new[]、malloc等)。
编辑:以下内容与问题的前一次修订有关
你错过了和new[]一起去的delete[]。您刚刚发布的代码甚至不应该编译,因为您没有在任何地方定义name。
发布于 2015-07-08 17:35:51
这不是真正的C++。如果您替换了
delete[] command;使用
free(command);然后你会得到一个C程序。然而,它仍然是一个be程序--我的观点是,在您的程序中有非常少的C++。
如果您完全采用C++,问题就会得到解决。在现代C++中,任何事情都不使用[]数组(某些非常特殊的情况除外)。如果您想要一个字符集合,可以随意添加和删除字符,那么只需使用string即可。
#include <string>
using std::string;
int main(int argc, char * argv[]){
if(argc != 2) return -1;
string command = "raspistill -o ";
command.append(argv[1]);
system(command.c_str()); // unfortunately, system() doesn't accept string
// directly, must convert to pointer with .c_str()
return 0;
}您不需要在编写得很好的(现代的) delete中使用C++。实际上,在这里尝试delete command (或delete &command)是一个严重的错误。
不要使用指针(除了std::shared_ptr和std::unique_ptr,您真正想要的是“远程操作”行为)。不要使用new,也不要使用delete。
如果这不能直接回答你原来的问题,很抱歉。但我认为,在这种情况下,直接跳到C++是最好的方法。
发布于 2015-07-08 17:33:06
我想是缓冲区溢出了。command还不够长。你在破坏这堆东西。更糟糕的是,在堆中没有分配的内存上使用delete。
https://stackoverflow.com/questions/31299567
复制相似问题