Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么我在这个特定的代码中有错误?_C++ - Fatal编程技术网

C++ 为什么我在这个特定的代码中有错误?

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

这个程序应该接受一个文件名和参数,并创建一个进程,在将结果输出到终端时执行代码(我也不知道为什么这样做不起作用)

我发现seg错误来自于我试图释放argvNew字符串数组

#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){
cerr
argvNew
是自动分配的,这意味着当它超出范围时,它所持有的资源将自动释放。您只需
释放
动态分配的数组:

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);