我试图了解在从代码中调用
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()
的文档,但找不到任何关于智能指针的提及。
像
execve
这样的系统调用或计算机着火对于 C++ 来说是一个“断章取义”的问题。当您调用execve
时,程序流程将转换到内核。内核完全重新初始化内存空间,原来的程序没有机会再次运行。智能指针和它用来管理的内存根本不复存在。
如果您想使用智能指针的释放动作来执行程序外部可见的副作用(例如文件或网络 I/O),请在调用
execve
之前手动释放它们。