c++ - 使用 strcat 后删除字符数组会导致段错误

标签 c++ segmentation-fault strcat

在我的代码中,我使用 system() 来调用仅存在于树莓派外壳上的函数,特别是“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++ 字符串时,这个问题就消失了。为什么这会导致段错误,我该如何避免?

最佳答案

这不是真正的 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;
}

在编写良好的(现代)C++ 中,您不需要delete。事实上,在此处尝试delete command(或delete &command)将是一个严重的错误。

不要使用指针(std::shared_ptrstd::unique_ptr 除外,在这些地方您确实需要“action-at-a-distance”行为)。不要使用new,也不要使用delete

如果这不能直接回答您原来的问题,我们深表歉意。但我觉得在这种情况下直接跳到 C++ 是最好的方法。

关于c++ - 使用 strcat 后删除字符数组会导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31299567/

相关文章:

c++ - TBB concurrent_queue 使用示例

c++ - 将 lambda 隐式转换为 boost::function

c++ - 为什么分配器常量在 vector 中?

c++ - 我是否需要对 C++ 中的每个 new 使用 delete?

c - 使用递归求和运算时出现段错误

c - 疾病模拟器上的段错误

c++ - 第二次无法捕获段错误

c - 尝试将换行符添加到 char 数组的末尾时,strcat 不起作用

c - 如何将 strcat 与未指定长度的 char* 一起使用

c - 不返回字符串。这个程序将 123 这样的数字转换为 "One Two Three"这样的单词,为什么最后我什么也没有得到?