tao*_*tao 2 c++ destructor scope
我正在学习C++中的内存管理,但我不明白为什么在离开范围时只调用了一些析构函数.在下面的代码中,当myfunc结束时,只调用obj1析构函数,而不是动态分配的obj2.
int myfunc (cl1 *oarg) {
cout << "myfunc called" << std::endl;
cl1 obj1(222,"NY");
cl1 *obj2;
obj2= new cl1;
oarg->disp();
obj2 -> ~cl1 ;
}
Run Code Online (Sandbox Code Playgroud)
这是我的析构函数:
cl1 :: ~cl1 () {
std::cout<< " cl1 destructor called"<<std::endl;
std::cout << this->data << std::endl; //just to identify the obj
delete [] str;
str = NULL ;
};
Run Code Online (Sandbox Code Playgroud)
如果使用分配对象 new
obj2= new cl1;
Run Code Online (Sandbox Code Playgroud)
然后,除非你调用delete它,否则它的析构函数不会被隐式调用.
编辑:作为@David,注释中的含义,可以明确地调用对象的析构函数,但根据我的经验,除非使用新版本的新版本,否则很少需要手动调用析构函数.
堆栈上的变量在其作用域结束时被隐式清除(通过调用它们的析构函数).
动态分配的对象不会被隐式清除,用户有责任明确地调用它们delete.
这就是不应该使用原始指针但使用智能指针的原因.