在局部作用域內,用new 產生的對象, 在退出作用域之前, 不delete,就會造成內存泄漏..
代碼例子如下:
#include <string>
#include <iostream>
class A
{
public:
A(){std::cout<<"constructor A"<<std::endl;};
~A(){std::cout<<"desstructor A"<<std::endl;};
void test(){std::cout<<"invoke test"<<std::endl;};
};
class B:public A
{
public:
B(){std::cout<<"constructor B"<<std::endl;};
~B(){std::cout<<"desstructor B"<<std::endl;};
};
void extentest()
{
B *myb = new B();
myb->test();
}
int main(int argc,char* argv[]){
extentest();
return 0;
}
#include <iostream>
class A
{
public:
A(){std::cout<<"constructor A"<<std::endl;};
~A(){std::cout<<"desstructor A"<<std::endl;};
void test(){std::cout<<"invoke test"<<std::endl;};
};
class B:public A
{
public:
B(){std::cout<<"constructor B"<<std::endl;};
~B(){std::cout<<"desstructor B"<<std::endl;};
};
void extentest()
{
B *myb = new B();
myb->test();
}
int main(int argc,char* argv[]){
extentest();
return 0;
}
允許結果:
constructor A
constructor B
invoke test
constructor B
invoke test
沒有調用析構函數
爲了避免這樣的後果, 通常使用boost庫裏的 shared_ptr 模板,這樣就不需要使用delete
修改void extentest()
void extentest()
{
shared_ptr<B> myb= new B();
myb->test();
}
{
shared_ptr<B> myb= new B();
myb->test();
}
當變量myb 作用域消失後,會自動刪除new B 的對象.