在局部作用域内,用new 产生的对象, 在退出作用域之前, 不delete,就会造成内存泄漏..
代码例子如下:
![InBlock.gif](https://s1.51cto.com/images/editer/InBlock.gif)
#include <
string>
![InBlock.gif](https://s1.51cto.com/images/editer/InBlock.gif)
#include <iostream>
class A
![InBlock.gif](https://s1.51cto.com/images/editer/InBlock.gif)
{
public:
![InBlock.gif](https://s1.51cto.com/images/editer/InBlock.gif)
A(){std::cout<<
"constructor A"<<std::endl;};
![InBlock.gif](https://s1.51cto.com/images/editer/InBlock.gif)
~A(){std::cout<<
"desstructor A"<<std::endl;};
void test(){std::cout<<
"invoke test"<<std::endl;};
![InBlock.gif](https://s1.51cto.com/images/editer/InBlock.gif)
};
class B:
public A
![InBlock.gif](https://s1.51cto.com/images/editer/InBlock.gif)
{
public:
![InBlock.gif](https://s1.51cto.com/images/editer/InBlock.gif)
B(){std::cout<<
"constructor B"<<std::endl;};
![InBlock.gif](https://s1.51cto.com/images/editer/InBlock.gif)
~B(){std::cout<<
"desstructor B"<<std::endl;};
![InBlock.gif](https://s1.51cto.com/images/editer/InBlock.gif)
};
void extentest()
![InBlock.gif](https://s1.51cto.com/images/editer/InBlock.gif)
{
![InBlock.gif](https://s1.51cto.com/images/editer/InBlock.gif)
B *myb =
new B();
![InBlock.gif](https://s1.51cto.com/images/editer/InBlock.gif)
myb->test();
![InBlock.gif](https://s1.51cto.com/images/editer/InBlock.gif)
}
int main(
int argc,
char* argv[]){
![InBlock.gif](https://s1.51cto.com/images/editer/InBlock.gif)
extentest();
return 0;
![InBlock.gif](https://s1.51cto.com/images/editer/InBlock.gif)
}
允许结果:
![InBlock.gif](https://s1.51cto.com/images/editer/InBlock.gif)
constructor A
![InBlock.gif](https://s1.51cto.com/images/editer/InBlock.gif)
constructor B
![InBlock.gif](https://s1.51cto.com/images/editer/InBlock.gif)
invoke test
没有调用析构函数
为了避免这样的后果, 通常使用boost库里的 shared_ptr 模板,这样就不需要使用delete
修改void extentest()
void extentest()
![InBlock.gif](https://s1.51cto.com/images/editer/InBlock.gif)
{
![InBlock.gif](https://s1.51cto.com/images/editer/InBlock.gif)
shared_ptr<B> myb=
new B();
![InBlock.gif](https://s1.51cto.com/images/editer/InBlock.gif)
myb->test();
![InBlock.gif](https://s1.51cto.com/images/editer/InBlock.gif)
}
当变量myb 作用域消失后,会自动删除new B 的对象.
转载于:https://blog.51cto.com/swellfish/343304