Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;在子进程中使用std::string时内存泄漏_C++_String_Memory Leaks_Fork - Fatal编程技术网

C++ C++;在子进程中使用std::string时内存泄漏

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

我对这段代码有问题,valgrind在std::basic_字符串中检测到内存泄漏,我不知道我做错了什么。只有在子进程中使用std::string时才会发生泄漏。你能告诉我问题出在哪里吗?我以前从未使用C++中的Frk(),所以我没有太多的经验。
#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析构函数运行。