在fork / exec之前分配内存并且不释放它是否安全?

时间:2014-06-04 18:25:55

标签: c++

我有这段代码:

  std::vector<std::string> args_ {"./test_script.sh"};
  pid_t child_pid = fork();

  switch (child_pid)
  {
  case 0:
  {
    // Child process
    char ** args = new char*[args_.size() + 1];
    for(size_t i = 0; i < args_.size(); ++i){
      args[i] = new char[args_[i].size() + 1];
      strcpy(args[i], args_[i].c_str());
    }
    args[args_.size()] = NULL;

    execv(args[0], const_cast<char**>(args));
  }

没有释放分配的内存可以吗?因为子进程最终将结束,操作系统将回收内存?如果我想要释放它,我怎么能这样做?

谢谢,

2 个答案:

答案 0 :(得分:3)

execv调用将进程替换为另一个进程时,将释放进程分配的所有(用户分配的)内存。不要忘记检查以确保呼叫成功并正确处理。如果失败了,你可能想要释放内存,或者如果你不需要再做任何事情就退出。

  

execve()在成功时不会返回,而text,data,bss和   调用进程的堆栈被程序覆盖   加载。

http://linux.about.com/od/commands/l/blcmdl2_execve.htm

答案 1 :(得分:1)

释放分配的内存总是一个好主意。它可能不会在任何一个特定的实例中引起任何问题,但如果你养成忘记释放记忆的习惯,你就会遇到问题。你可以通过以下方式释放它:

    for(size_t i = 0; i < args_.size(); ++i)
      delete[] args_[i];

    delete[] args_;