C++内存泄露问题
2016-10-28 17:19
162 查看
以下记录一下以前解决内存泄露问题的一些经历:
1、首先用valgrind工具进行检查(这个工具不能检查出所有问题):
(1)pthread_create引起的一个内存泄露
用valgrind –tool=memcheck –leak-check=full –undef-value-errors=yes ./connect_svr进行内存泄露检查时,提示:
624 bytes in 1 blocks are possibly lost in loss record 43 of 43
==567== at 0x4C2B974: calloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==567== by 0x4011DE4: _dl_allocate_tls (in /usr/lib64/ld-2.17.so)
==567== by 0x4E3D960: pthread_create@@GLIBC_2.2.5 (in /usr/lib64/libpthread-2.17.so)
==567== by 0x4A7E69: CLogger::Init(unsigned int, unsigned int, unsigned short) (Log.cpp:66)
==567== by 0x48E051: main (connect_route.cpp:75)
原因:
线程的分离状态决定一个线程以什么样的方式来终止自己。线程的默认属性是非分离状态,这种情况下,原有的线程等待创建的线程结束。只有当pthread_join()函数返回时,创建的线程才算终止,才能释放自己占用的系统资源。而分离线程不是这样子的,它没有被其他的线程所等待,自己运行结束了,线程也就终止了,马上释放系统资源。程序员应该根据自己的需要,选择适当的分离状态。
解决方法:
a.使用pthread_join()函数回收相关内存区域。
pthread_t tid;
void* state;
pthread_create(&tid, NULL, test, NULL);
pthread_join(tid, &state);
b.可以调用 pthread_detach() 函数分离线程。
pthread_t tid;
pthread_create(&tid, NULL, test, NULL);
pthread_detach(tid);
当然,也可以在 thread function 中调用。
void* test(void* arg)
{
…..
pthread_detach(pthread_self());
return NULL;
}
c.使用线程属性。
pthread_attr_t attr;
pthread_t tid;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
pthread_create(&tid, &attr, test, NULL);
sleep(3);//等待线程结束
pthread_attr_destroy(&attr);
根据实际需要,任选其一即可。
接下来还发现两个地方:
2、 new []操作没有写delete[]
char* szContent = new char[HTTP_RESPONSE_HTML_MAX];
snprintf(szContent, HTTP_RESPONSE_HTML_MAX, HTTP_RESPONSE_HTML, strContent.length(), strContent.c_str());
忘记写:
delete[] szContent;
3、单例类中未在析构函数中释放内存
CCRHttpConnMgr::~CCRHttpConnMgr() {
// TODO Auto-generated destructor stub
if(NULL != m_pInstance){
delete m_pInstance;
}
}
1、首先用valgrind工具进行检查(这个工具不能检查出所有问题):
(1)pthread_create引起的一个内存泄露
用valgrind –tool=memcheck –leak-check=full –undef-value-errors=yes ./connect_svr进行内存泄露检查时,提示:
624 bytes in 1 blocks are possibly lost in loss record 43 of 43
==567== at 0x4C2B974: calloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==567== by 0x4011DE4: _dl_allocate_tls (in /usr/lib64/ld-2.17.so)
==567== by 0x4E3D960: pthread_create@@GLIBC_2.2.5 (in /usr/lib64/libpthread-2.17.so)
==567== by 0x4A7E69: CLogger::Init(unsigned int, unsigned int, unsigned short) (Log.cpp:66)
==567== by 0x48E051: main (connect_route.cpp:75)
原因:
线程的分离状态决定一个线程以什么样的方式来终止自己。线程的默认属性是非分离状态,这种情况下,原有的线程等待创建的线程结束。只有当pthread_join()函数返回时,创建的线程才算终止,才能释放自己占用的系统资源。而分离线程不是这样子的,它没有被其他的线程所等待,自己运行结束了,线程也就终止了,马上释放系统资源。程序员应该根据自己的需要,选择适当的分离状态。
解决方法:
a.使用pthread_join()函数回收相关内存区域。
pthread_t tid;
void* state;
pthread_create(&tid, NULL, test, NULL);
pthread_join(tid, &state);
b.可以调用 pthread_detach() 函数分离线程。
pthread_t tid;
pthread_create(&tid, NULL, test, NULL);
pthread_detach(tid);
当然,也可以在 thread function 中调用。
void* test(void* arg)
{
…..
pthread_detach(pthread_self());
return NULL;
}
c.使用线程属性。
pthread_attr_t attr;
pthread_t tid;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
pthread_create(&tid, &attr, test, NULL);
sleep(3);//等待线程结束
pthread_attr_destroy(&attr);
根据实际需要,任选其一即可。
接下来还发现两个地方:
2、 new []操作没有写delete[]
char* szContent = new char[HTTP_RESPONSE_HTML_MAX];
snprintf(szContent, HTTP_RESPONSE_HTML_MAX, HTTP_RESPONSE_HTML, strContent.length(), strContent.c_str());
忘记写:
delete[] szContent;
3、单例类中未在析构函数中释放内存
CCRHttpConnMgr::~CCRHttpConnMgr() {
// TODO Auto-generated destructor stub
if(NULL != m_pInstance){
delete m_pInstance;
}
}
相关文章推荐
- C++ protocol buffer内存泄露问题
- C++中vector内存泄露问题
- C++内存泄露问题
- C++虚析构函数的使用(可能造成内存泄露问题)
- C++内存泄露问题解决方案(转)
- C++内存泄露的问题
- 一个IQ问题的C++模拟
- C/C++实际编程常见问题分析
- 遭遇C++基础问题 [2004年5月29日 18:33 ]
- 关于C++模板和重载的小问题
- 跨平台C++软件开发中,由于不同操作系统对Unicode的支持差异,而导致的一些问题及解决方案。
- C/C++内存问题检查利器—Purify (四)
- C/C++中align的问题
- 有关C++界面皮肤控件的问题!!
- 波松分酒问题 C++求最优解.
- 关于C++模板和重载的小问题
- C/C++内存问题检查利器—Purify (二)
- C/C++内存问题检查利器—Purify (三)
- C/C++内存问题检查利器—Purify (五)
- C/C++内存问题检查利器—Purify (三)