首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我要在这个特定的代码中分割错误?

为什么我要在这个特定的代码中分割错误?
EN

Stack Overflow用户
提问于 2016-08-30 23:19:01
回答 2查看 86关注 0票数 2

这个程序应该使用一个文件名和参数,并创建一个执行代码的进程,同时将结果输出到终端(我也不知道这是为什么)。

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

代码语言:javascript
复制
#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);
}

测试输入:./myProgram /bin/ls -l

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-30 23:24:29

argvNew是自动分配的,这意味着当它超出作用域时,它所持有的资源会自动释放。您只需要free动态分配的数组:

代码语言:javascript
复制
char a[50]; // the [50] means automatic allocation
// ...
// no need to free
代码语言:javascript
复制
char* a = malloc(50); // dynamic allocation
// ...
// need to free later, or memory leak
free(a);
票数 3
EN

Stack Overflow用户

发布于 2016-08-30 23:30:09

代码语言:javascript
复制
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);

请注意,您不需要调用free(),因为argvNew[]包含的指针不指向新的/malloc‘ed数据,而是指向argv数组的值,这些值由父进程管理,不应该由您显式地释放()。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39238486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档