使用 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_ptr
和 std::unique_ptr
除外,您确实需要 'action-at-a-distance' 行为)。不要使用 new
,也不要使用 delete
.
抱歉,如果这不能直接回答您原来的问题。但我觉得在这种情况下直接跳到 C++ 是最好的方法。
在我的代码中,我使用 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_ptr
和 std::unique_ptr
除外,您确实需要 'action-at-a-distance' 行为)。不要使用 new
,也不要使用 delete
.
抱歉,如果这不能直接回答您原来的问题。但我觉得在这种情况下直接跳到 C++ 是最好的方法。