gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 19:59:03 24 4
gpt4 key购买 nike

这段代码有问题,valgrind 检测到 std::basic_string 中的内存泄漏,我不知道我做错了什么。只有在子进程中使用 std::string 时才会发生泄漏。你能告诉我,问题出在哪里吗?我以前从未在 C++ 中使用过 fork(),所以我没有太多经验。

#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;
}

最佳答案

_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 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;
}

但这仍然无法说明 atexit 函数或全局析构函数。所以还是要避免这样做。

关于在子进程中使用 std::string 时发生 C++ 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15670870/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com