在程序中调用 execv() 时智能指针的内存何时被清除?

问题描述 投票:0回答:1

我试图了解在从代码中调用

execv()
时,共享(智能)指针拥有的内存何时被清除。


假设以下代码:

#include <memory>

class Test { public: ~Test() { std::cout << "Test destroyed."; } };

int main() {
  std::shared_ptr<Test> p = std::make_shared<Test>();
  std::shared_ptr<Test> q = p;

  p.reset();

  // Call execv().
  execv("/bin/program", "/bin/program");

  // This code will never be executed, because execv() replaces the current process image.
  // Will the memory pointed to by q be cleared?
  return 0;
}

调用

execv("/bin/program", "/bin/program");
时,当前过程映像将替换为新过程映像。
我的问题是,当新进程启动时,共享指针拥有的内存是否会被清除,或者我们应该在调用
q.reset()
之前显式调用
execv("/bin/program", "/bin/program");
吗?

我尝试查看

execv()
的文档,但找不到任何关于智能指针的提及。

c++ memory shared-ptr smart-pointers execv
1个回答
0
投票

execve
这样的系统调用或计算机着火对于 C++ 来说是一个“断章取义”的问题。当您调用
execve
时,程序流程将转换到内核。内核完全重新初始化内存空间,原来的程序没有机会再次运行。智能指针和它用来管理的内存根本不复存在。

如果您想使用智能指针的释放动作来执行程序外部可见的副作用(例如文件或网络 I/O),请在调用

execve
之前手动释放它们。

© www.soinside.com 2019 - 2024. All rights reserved.