首页 新闻 会员 周边

这个vector对象的资源该如何释放呢?

0
悬赏园豆:50 [已解决问题] 解决于 2015-03-05 14:24

下面这个程序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都一样,真是奇怪啊,如何处理呢?

Patrickz10的主页 Patrickz10 | 初学一级 | 园豆:7
提问于:2015-03-04 22:14
< >
分享
最佳答案
0

你这个不是内存泄漏,而应该是内存重释放。

    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());
}

收获园豆:50
天方 | 大侠五级 |园豆:5407 | 2015-03-05 00:46

实在是正中要害,谢谢!

Patrickz10 | 园豆:7 (初学一级) | 2015-03-05 21:40
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册