请问内存泄漏有关问题
请教内存泄漏问题
请看以下代码,有内存泄漏问题,应该如何解决呢?
class Button
{
public:
Button(Mat &base):mBaseImage(base){}
Mat &mBaseImage;
};
int _tmain(int argc, _TCHAR* argv[])
{
Mat k=imread("1.jpg",1);
vector< Button *> mybutton;
while(1)
{
Button temp(k);
mybutton.push_back(&temp);
}
}
谢谢大家!
------解决思路----------------------
楼主代码没有内存泄漏
内存泄漏也称作“存储渗漏”,用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元。直到程序结束。(其实说白了就是该内存空间使用完毕之后未回收)即所谓内存泄漏。
用while循环把对象放到容器里面,导致容器一直增大,但是还是在使用中,没有使用完毕,所以不叫内存泄漏。
因此,这个内存暴涨的原因是容器一直增大导致的
------解决思路----------------------
这里, 你push_back的是局部变量的地址,而局部变量在出了作用域(这里就是你的while的}),就会释放,也就是说你push_back进去的其实是一个野指针。当while循环再次进入{的时候,会重新创建Button temp(k)。
因此你的这个循环就是一直在创建局部对象(会消耗内存),push_back局部变量的地址,释放局部对象(会释放内存,但是造成vector< Button *> mybutton这里面都是野指针),所以你的内存消耗,不是创建Button对象导致,而是消耗在vector里面要开辟空间保存指针,不是内存泄漏导致
------解决思路----------------------
这种情况,要用智能指针,引用计数机制
否则,
1)不是无法delete----修改元素,对于容器是很平常的事情,delete 却需要没有被改动的分配时候的原始内存。----
2)就是很容易会出现野指针之类的东东。---例如 push 局部自动变量的地址---
3)还有就是:
虽然 指针指向的内容变了,
但是指针本身保持不变,容器里面是同一个指针,指向同一块内存,同一个对象,
而你希望它可以有不同的值
这样,容器并没有记住历史,所有指针指向的对象,都只是同一对象,所以只有最后一个值被保留下来。
虽然历史上,他曾经有过不同的值,但是只有最后一个值,可以看到
这就是指针和容器的某种不合拍现象。
保存指针的容器,容易出错的地方。
请看以下代码,有内存泄漏问题,应该如何解决呢?
class Button
{
public:
Button(Mat &base):mBaseImage(base){}
Mat &mBaseImage;
};
int _tmain(int argc, _TCHAR* argv[])
{
Mat k=imread("1.jpg",1);
vector< Button *> mybutton;
while(1)
{
Button temp(k);
mybutton.push_back(&temp);
}
}
谢谢大家!
------解决思路----------------------
楼主代码没有内存泄漏
内存泄漏也称作“存储渗漏”,用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元。直到程序结束。(其实说白了就是该内存空间使用完毕之后未回收)即所谓内存泄漏。
用while循环把对象放到容器里面,导致容器一直增大,但是还是在使用中,没有使用完毕,所以不叫内存泄漏。
因此,这个内存暴涨的原因是容器一直增大导致的
------解决思路----------------------
while(1)
{
Button temp(k);
mybutton.push_back(&temp);
}
这里, 你push_back的是局部变量的地址,而局部变量在出了作用域(这里就是你的while的}),就会释放,也就是说你push_back进去的其实是一个野指针。当while循环再次进入{的时候,会重新创建Button temp(k)。
因此你的这个循环就是一直在创建局部对象(会消耗内存),push_back局部变量的地址,释放局部对象(会释放内存,但是造成vector< Button *> mybutton这里面都是野指针),所以你的内存消耗,不是创建Button对象导致,而是消耗在vector里面要开辟空间保存指针,不是内存泄漏导致
------解决思路----------------------
这种情况,要用智能指针,引用计数机制
否则,
1)不是无法delete----修改元素,对于容器是很平常的事情,delete 却需要没有被改动的分配时候的原始内存。----
2)就是很容易会出现野指针之类的东东。---例如 push 局部自动变量的地址---
3)还有就是:
虽然 指针指向的内容变了,
但是指针本身保持不变,容器里面是同一个指针,指向同一块内存,同一个对象,
而你希望它可以有不同的值
这样,容器并没有记住历史,所有指针指向的对象,都只是同一对象,所以只有最后一个值被保留下来。
虽然历史上,他曾经有过不同的值,但是只有最后一个值,可以看到
这就是指针和容器的某种不合拍现象。
保存指针的容器,容易出错的地方。