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

Deleting a character array after using strcat causes a seg fault

在我的代码中,我使用 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++ 字符串时,这个问题就消失了。为什么这会导致段错误,我该如何避免?

您正试图在您分配了常量字符串文字的 char[] 上调用 strcat。这将失败。此外,您没有理由删除[] 上述 command,因为您没有在免费存储上动态分配它(例如使用 new[]、malloc 等)

编辑:以下内容与问题的先前修订相关

您缺少 new[] 来搭配 delete[]。您刚刚发布的代码甚至不应该被编译,因为您没有在任何地方定义 name

我想缓冲区溢出了。 command 不够长。你正在破坏堆栈。更糟糕的是,您在未在堆上分配的内存上使用 delete

这不是真正的 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_ptrstd::unique_ptr 除外,您确实需要 'action-at-a-distance' 行为)。不要使用 new,也不要使用 delete.

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