C++ C++;在子进程中使用std::string时内存泄漏
我对这段代码有问题,valgrind在std::basic_字符串中检测到内存泄漏,我不知道我做错了什么。只有在子进程中使用std::string时才会发生泄漏。你能告诉我问题出在哪里吗?我以前从未使用C++中的Frk(),所以我没有太多的经验。C++ C++;在子进程中使用std::string时内存泄漏,c++,string,memory-leaks,fork,C++,String,Memory Leaks,Fork,我对这段代码有问题,valgrind在std::basic_字符串中检测到内存泄漏,我不知道我做错了什么。只有在子进程中使用std::string时才会发生泄漏。你能告诉我问题出在哪里吗?我以前从未使用C++中的Frk(),所以我没有太多的经验。 #include <iostream> #include <string> #include <cerrno> #include <cstdio> #include <cstdlib> #in
#include <iostream>
#include <string>
#include <cerrno>
#include <cstdio>
#include <cstdlib>
#include <unistd.h>
#include <sys/wait.h>
int main(int argc, char *argv[])
{
pid_t childPid = fork();
if (childPid == -1)
{
perror("fork");
return EXIT_FAILURE;
}
else if (childPid == 0)
{
std::cout << "Child PID: " << getpid() << std::endl;
std::string str("something"); //valgrind detects mem leak here
_Exit(EXIT_SUCCESS);
}
else
{
//std::string str("something"); //but not here
}
waitpid(-1, 0, 0);
return EXIT_SUCCESS;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
pid_t childPid=fork();
if(childPid==-1)
{
佩罗尔(“福克”);
返回退出失败;
}
else if(childPid==0)
{
std::cout\u Exit
不会运行任何析构函数或atexit
函数,它只是立即结束
很明显,这会在RAII上打一个大洞,所以不要这样做
在保持相同的退出策略的同时实施“不要这样做”的一种方法可能是:
template <typename Func, typename... Args>
int wrap_cpp_code(Func&& func, Args&&.. args)
{
try
{
return std::forward<Func>(func)(std::forward<Args>(args)...);
}
catch (...)
{
return EXIT_FAILURE;
}
}
模板
int wrap_cpp_代码(Func&&Func,Args&&..Args)
{
尝试
{
返回std::forward(func)(std::forward(args)…);
}
捕获(…)
{
返回退出失败;
}
}
在运行其作用域下的所有析构函数之前,它不会给出返回值,给出:
int child_main(int argc, char *argv[])
{
std::cout << "Child PID: " << getpid() << std::endl;
std::string str("something");
return EXIT_SUCCESS;
}
int main(int argc, char *argv[])
{
pid_t childPid = fork();
if (childPid == -1)
{
perror("fork");
return EXIT_FAILURE;
}
else if (childPid == 0)
{
int ret = wrap_cpp_code(child_main, argc, argv);
_Exit(ret);
}
else
{
/*
int ret = wrap_cpp_code(xyz, argc, argv);
*/
}
waitpid(-1, 0, 0);
return EXIT_SUCCESS;
}
int-child\u-main(int-argc,char*argv[])
{
std::cout而不是调用\u Exit
尝试像在函数末尾那样返回。退出是否会阻止堆栈展开?这可能会阻止std::string析构函数运行。