我有这段代码:
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));
}
没有释放分配的内存可以吗?因为子进程最终将结束,操作系统将回收内存?如果我想要释放它,我怎么能这样做?
谢谢,
答案 0 :(得分:3)
当execv
调用将进程替换为另一个进程时,将释放进程分配的所有(用户分配的)内存。不要忘记检查以确保呼叫成功并正确处理。如果失败了,你可能想要释放内存,或者如果你不需要再做任何事情就退出。
execve()在成功时不会返回,而text,data,bss和 调用进程的堆栈被程序覆盖 加载。
答案 1 :(得分:1)
释放分配的内存总是一个好主意。它可能不会在任何一个特定的实例中引起任何问题,但如果你养成忘记释放记忆的习惯,你就会遇到问题。你可以通过以下方式释放它:
for(size_t i = 0; i < args_.size(); ++i)
delete[] args_[i];
delete[] args_;