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

时间:2015-07-08 17:26:30

标签: c++ segmentation-fault strcat

在我的代码中,我使用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故障,我该如何避免它呢?

3 个答案:

答案 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_ptrstd::unique_ptr除外,您真正需要“远距离行动”行为)。不要使用new,也不要使用delete

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

答案 1 :(得分:0)

您正尝试在已为其指定常量字符串文字的char []上调用strcat。这将失败。此外,您没有理由删除[]前面提到的command,因为您没有在免费商店中动态分配它(例如使用new [],malloc等。)

编辑:以下内容与之前修订的问题

相关

您错过new[]以使用delete[]。您刚刚发布的代码甚至不应该编译,因为您没有在任何地方定义name

答案 2 :(得分:0)

我认为缓冲区溢出。 command时间不长。你正在破坏堆栈。更糟糕的是,你在没有在堆上分配的内存上使用delete