【问题标题】:Is it safe to allocated memory and not free it before a fork/exec? [duplicate]在 fork/exec 之前分配内存并且不释放它是否安全? [复制]
【发布时间】:2025-11-22 05:35:02
【问题描述】:

我有这个代码:

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

不释放分配的内存可以吗?因为子进程最终将结束并且操作系统将回收内存?如果我还是想释放它,我该怎么做?

谢谢,

【问题讨论】:

    标签: c++


    【解决方案1】:

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

    execve() 成功时不返回,文本、数据、bss 和 调用进程的堆栈被程序的堆栈覆盖 已加载。

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 感谢您的回答。知道怎么释放内存,不知道哪里需要释放?
      • 使用完 args_。在这种情况下,就在 case 0 块的末尾。
      • 如果 execv 调用成功,则永远不会到达 case 0 块的末尾。如果 execv 失败,那么问题远不止一点内存泄漏。
      • @DavidHammen:在这种情况下你是对的,但就像我说的那样:“它可能不会在任何特定情况下造成任何问题,但如果你养成忘记释放记忆的习惯,你会遇到问题。”添加代码的释放块不会影响其余代码的任何内容,但确实会养成良好的习惯。