离开范围时不会调用析构函数

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)

Alo*_*ave 6

如果使用分配对象 new

obj2= new cl1;
Run Code Online (Sandbox Code Playgroud)

然后,除非你调用delete它,否则它的析构函数不会被隐式调用.

编辑:作为@David,注释中的含义,可以明确地调用对象的析构函数,但根据我的经验,除非使用新版本的新版本,否则很少需要手动调用析构函数.

堆栈上的变量在其作用域结束时被隐式清除(通过调用它们的析构函数).

动态分配的对象不会被隐式清除,用户有责任明确地调用它们delete.

这就是不应该使用原始指针但使用智能指针的原因.