注册 登录
编程论坛 C++教室

请问这种情况会内存泄露吗?

w906414 发布于 2020-04-13 21:23, 2126 次点击
程序代码:
Class tmpClass
{
    private:
        std::vector<std::vector<char> > Map;
    Public:
        tmpClass()
        {
        }
        void test(int num)
        {
            std::vector<std::vector<char> >  tmpMap(1,std::vector<char>(a));
            Map = a;
        }
}
int main()
{
    tmpClass * tmp = new tmpClass();
    while(1)
    {
        tmp->test(1);
    }
    return 0;
}

 假设tmp对象一直不会delete的情况下,这样vector的赋值方式会泄露吗?谢谢各位大佬,用VS的内存检测工具跑好像会泄露,但是看不太明白
 请问如果泄露的话为什么会泄露,如果我想达成这样的赋值方式的话,怎么才可以避免泄露?
 再次谢谢各位不吝赐教,谢谢!
 
9 回复
#2
lin51616782020-04-13 22:18
不会 后面的疑问就没解答的必要了
但是 我今天说了特别多的但是
但是 你的a是啥
#3
w9064142020-04-14 09:19
程序代码:
Class tmpClass
{
    private:
        std::vector<std::vector<char> > Map;
    Public:
        tmpClass()
        {
        }
        void test(int num)
        {
            std::vector<std::vector<char> >  tmpMap(1,std::vector<char>(a));
            Map= a;
        }
}
int main()
{
    tmpClass * tmp = new tmpClass();
    while(1)
    {
        tmp->test(1);
    }
    return 0;
}



[此贴子已经被作者于2020-4-14 09:56编辑过]

#4
w9064142020-04-14 09:23
以下是引用lin5161678在2020-4-13 22:18:52的发言:

不会 后面的疑问就没解答的必要了
但是 我今天说了特别多的但是
但是 你的a是啥


这是一个资源分配算法。map是需要多次初始化的资源池,每次运行新初始化一个相同结构的资源池a,然后用a赋值给map。把map保存下来,用于资源搜索。
但是担心这么操作,a或map的内存会被泄露。
如果对象一直没有delete,然后test方法运行非常多次,会导致占用内存过大吗?

[此贴子已经被作者于2020-4-14 09:56编辑过]

#5
lin51616782020-04-14 10:55
以下是引用w906414在2020-4-14 09:23:55的发言:



这是一个资源分配算法。map是需要多次初始化的资源池,每次运行新初始化一个相同结构的资源池a,然后用a赋值给map。把map保存下来,用于资源搜索。
但是担心这么操作,a或map的内存会被泄露。
如果对象一直没有delete,然后test方法运行非常多次,会导致占用内存过大吗?

a是没定义的符号 无法确定是什么东西
后面的疑问无法回答
#6
w9064142020-04-14 11:01
以下是引用lin5161678在2020-4-14 10:55:42的发言:


a是没定义的符号 无法确定是什么东西
后面的疑问无法回答

程序代码:
Class tmpClass
{
    private:
        std::vector<std::vector<char> > Map;
    Public:
        tmpClass()
        {
        }
        void test(int num)
        {
            std::vector<std::vector<char> >  tmpMap(1,std::vector<char>(num));
            Map= tmpMap;
        }
}
int main()
{
    tmpClass * tmp = new tmpClass();
    while(1)
    {
        tmp->test(1);
    }
    return 0;
}


Map= tmpMap;前面写错了  没有发现。。。
#7
lin51616782020-04-14 11:15
以下是引用w906414在2020-4-14 11:01:42的发言:


Class tmpClass
{
    private:
        std::vector<std::vector<char> > Map;
    Public:
        tmpClass()
        {
        }
        void test(int num)
        {
            std::vector<std::vector<char> >  tmpMap(1,std::vector<char>(num));
            Map= tmpMap;
        }
}
int main()
{
    tmpClass * tmp = new tmpClass();
    while(1)
    {
        tmp->test(1);
    }
    return 0;
}

Map= tmpMap;前面写错了  没有发现。。。

tmpMap 函数调用完成之后销毁
Map 只有一份
内存最高同时存在2个std::vector<std::vector<char> >
#8
w9064142020-04-14 11:31
以下是引用lin5161678在2020-4-14 11:15:19的发言:


tmpMap 函数调用完成之后销毁
Map 只有一份
内存最高同时存在2个std::vector<std::vector<char> >

假设map被tmpMap赋值过一次后,有了100Kb的内存。然后函数再运行一次,tmpMap又重新被分配了200Kb的内存并赋值给了Map。
那么Map最终应该会占用200Kb?之前的100Kb会被自动销毁吗?
#9
lin51616782020-04-14 11:42
回复 8楼 w906414
是的
#10
w9064142020-04-14 13:36
谢谢
1