下面这个程序main函数有内存泄漏,运行内存检测工具valgrind可以看到,该如何释放vector的资源呢?
#include <string>
#include <vector>
using namespace std;
class yitem
{
public:
yitem(const char *s1):m_data(s1) { m_str = new string("abc"); }
~yitem(void) { delete m_str; }
string &get_data() { return m_data; }
private:
string m_data;
string *m_str = nullptr;
};
int main()
{
vector<yitem> v1;
yitem a("A");
v1.push_back(a);
printf("ok\n");
return 0;
}
问题解决送50园豆,谢谢!
我在printf("ok\n");语句之前试加过下面3种语句,但还是一样,而且不见得泄漏少一些(都是能正常运行的,没有异常抛出)
//1:
delete &v1;
//2:
//v1.clear();
//3:
/*
for (auto it=v1.begin(); it!=v1.end(); it++)
{
delete &(*it);
}*/
本来此程序指针只有一个m_str,在析构函数中释放,看来应该没有什么问题,但总是报告内存泄露,加什么clear啊,delete都一样,真是奇怪啊,如何处理呢?
你这个不是内存泄漏,而应该是内存重释放。
v1.push_back(a);
这一句话会通过拷贝构造函数产生一个新的yitem对象压入vector, 但这是一个浅拷贝,新的对象共享了a对象的m_str的内存。 也就是说, 两个yitem对象共享着同一个m_str指针指向的string对象的,main函数执行完后会将这两个yitem对象都会执行析构函数,导致其被释放了两遍。
你在构造函数和析构函数都打上断点就会发现构造函数执行了一遍,析构函数执行了两遍。
至于解决方式,就是加上一个拷贝构造函数:
yitem(const yitem& other)
{
m_str = new string(other.m_str->c_str());
}
实在是正中要害,谢谢!