在我的代码中,我使用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 ++字符串时,这个问题就消失了。为什么这会导致seg故障,我该如何避免它呢?
答案 0 :(得分:2)
这不是真正的C ++。如果你替换
delete[] command;
与
free(command);
然后你会得到一个C程序。但它仍然是一个有缺陷的程序 - 我的观点是你的程序中只有很少的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 ++是最好的方法。
答案 1 :(得分:0)
您正尝试在已为其指定常量字符串文字的char []上调用strcat
。这将失败。此外,您没有理由删除[]前面提到的command
,因为您没有在免费商店中动态分配它(例如使用new [],malloc等。)
编辑:以下内容与之前修订的问题
相关您错过new[]
以使用delete[]
。您刚刚发布的代码甚至不应该编译,因为您没有在任何地方定义name
。
答案 2 :(得分:0)
我认为缓冲区溢出。 command
时间不长。你正在破坏堆栈。更糟糕的是,你在没有在堆上分配的内存上使用delete
。