在我的代码中,我使用 system() 来调用仅存在于树莓派外壳上的函数,特别是“raspistill”
执行此操作时,我按如下方式使用 char[] 和 strcat():
#include
int main(int argc, char * argv[]){
if(argc != 2) return -1;
char command[] = "raspistill -o ";
strcat(command, argv[1]);
system(command);
delete[] command;
trả về 0;
}
我收到警告说要删除的长度是 15,这是初始化命令时的初始长度,而不是 strcat 函数后的新长度。
当我改用带有 append() 的 C++ 字符串时,这个问题就消失了。为什么这会导致段错误,我该如何避免?
这不是真正的 C++。如果你更换
delete[] command;
Và
free(command);
然后你会得到一个C程序。然而,它仍然是一个有问题的程序——我的观点是你的程序中只有很少的 C++。
如果您完全接受 C++,问题就会得到解决。在现代 C++ 中,您不会将 []
数组用于任何事情(除非在某些非常特殊的情况下)。如果您想要一个字符集合,您可以在其中随意添加和删除字符,那么只需使用 sợi dây
.
#include
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()
trả về 0;
}
在编写良好的(现代)C++ 中,您不需要delete
。事实上,在此处尝试delete command
(hoặcdelete &command
)将是一个严重的错误。
不要使用指针(std::shared_ptr
Và std::unique_ptr
除外,在这些地方您确实需要“action-at-a-distance”行为)。不要使用mới
,也不要使用delete
.
如果这不能直接回答您原来的问题,我们深表歉意。但我觉得在这种情况下直接跳到 C++ 是最好的方法。
Tôi là một lập trình viên xuất sắc, rất giỏi!