在子进程中使用std::string时c++内存泄漏
C++ memory leak while using std::string in child process
我对这段代码有问题,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中打一个巨大的洞,所以不要这样做。
在保持相同退出策略的同时实现Don't Do That的一种方法可能是:
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 对象
- 内存未释放 std::list<std::shared_ptr<std::string>> C++
- 在先前调用 string::find 后添加内存分配和内存集会导致它返回 npos.为什么?
- 让 'std::vector<unsigned char>' 从 'std::string' 中窃取内存
- 如何在<N>不发生内存泄漏的情况下同时(线程安全)填充 c++11 std::map<std::string,std::bitset*>?
- 使用 boost::interprocess 共享内存时从 std::string 转换为 "MyShmString"
- std :: string ::擦除会导致内存损坏
- MISRA C++(规则 18-4-1)和动态内存分配 - 是否允许 std::string
- 通过读取文件创建映射<字符串,矢量>时如何管理内存<string>
- 使用std :: String键在共享内存中升级无序地图
- 返回 std::string 时出现瓦尔格林德内存泄漏
- 如果函数返回 std::vector<std::string>,是否存在内存泄漏?
- std::string试图释放错误的内存
- 执行std::string::clear回收与字符串关联的内存
- std::string是否对分配的内存进行重新计数?如何通过值传递和通过引用传递不同的std::string大小写
- String.replace() 和动态内存
- 'std::string::c_str()'如何返回不会导致内存泄漏或未定义的 C 字符串内容的 C 字符串?
- 如果我在 C++ 中为 "std::string &" 类型的参数指定默认值,这会导致内存泄漏吗?
- 为什么libc++的std::string实现占用了libstdc++的3倍内存?
- 使用 c_str() 返回的指针删除动态分配的 std::string 是否会导致C++内存泄漏