C++ 为什么我在这个特定的代码中有错误?
这个程序应该接受一个文件名和参数,并创建一个进程,在将结果输出到终端时执行代码(我也不知道为什么这样做不起作用) 我发现seg错误来自于我试图释放argvNew字符串数组C++ 为什么我在这个特定的代码中有错误?,c++,C++,这个程序应该接受一个文件名和参数,并创建一个进程,在将结果输出到终端时执行代码(我也不知道为什么这样做不起作用) 我发现seg错误来自于我试图释放argvNew字符串数组 #include <iostream> using namespace std; #include <unistd.h> #include <sys/wait.h> main(int argc, char **argv){ int pid; int i; char
#include <iostream>
using namespace std;
#include <unistd.h>
#include <sys/wait.h>
main(int argc, char **argv){
int pid;
int i;
char *argvNew[argc-1];
do{
//Check for failure
if ((pid = fork()) < 0) {
cerr << "Fork error\n";
exit(1);
}
//Check if parent
else if (pid == 0) {
/* child process */
//Add arguments to new array
for(i = 0; i < argc-2; i++){
argvNew[i] = argv[i+1];
}
argvNew[argc-2] = NULL;
if (execvp(argv[1], argvNew) < 0) {
cerr << "Execve error\n";
exit(1);
}
}
else {
/* parent */
waitpid(pid, NULL, 0);/* wait for the child to finish */
//Free argvNew
for(i = 0; i < argc-1;i++){
free(argvNew[i]);
}
free(argvNew);
}
//if we're need to create a new list of args in the future put it here
}while(!argc);
}
#包括
使用名称空间std;
#包括
#包括
主(内部argc,字符**argv){
int-pid;
int i;
char*argvNew[argc-1];
做{
//检查故障
如果((pid=fork())<0){
cerrargvNew
是自动分配的,这意味着当它超出范围时,它所持有的资源将自动释放。您只需释放
动态分配的数组:
char a[50]; // the [50] means automatic allocation
// ...
// no need to free
(i=0;i{
免费(argvNew[i]);
}
//下一个调用与free(argvNew[0])相同,可能是在您的位置
//因为你释放了两次东西
免费(argvNew);
请注意,您不需要调用free(),因为argvNew[]包含的指针不指向新的/malloc'ed数据,而是指向argv数组的值,该数组由父进程管理,不应由您显式地释放()
此下一次调用与free相同(argvNew[0])
-这是完全错误的。这两件事不是同义词。事实上,它与免费(&argvNew[0]);
在你的代码中没有一个malloc
,realloc
,strdup
,等等可以匹配免费()
call。简而言之,这里没有动态分配;只有非C++标准的VLA。因此,您可以假设此代码中出现的每一个free
都是错误的。是的。我开始意识到,我需要动态创建一个字符串数组来完成此操作。方括号不一定表示自动分配。事实上在块作用域中带有标识符的声明符是自动分配的,例如,在第二个示例中,a
本身是自动分配的。@M.M这是一个简单的示例,用于向某人解释数组的自动分配通常是如何工作的,因此,虽然您在技术上是正确的,但我不认为有必要将其编辑到ans中wer.劫持这个答案,我很惊讶char*arr[argc]
甚至会编译,我认为括号之间的值需要在编译时知道,显然不是这样,我错过了什么?@vianney这是一个VLA,或可变长度数组:
char* a = malloc(50); // dynamic allocation
// ...
// need to free later, or memory leak
free(a);
for(i = 0; i < argc-1;i++){
free(argvNew[i]);
}
//This next call is identical to free(argvNew[0]), probably where you're
//segfaulting, since you're freeing something twice
free(argvNew);