string * str=new string;
delete str;
当我删除指向对象的“str”时,是否会调用两个析构函数-一个用于指针本身,另一个用于它所指向的对象?
指针的析构函数会执行什么操作?
string * str=new string;
delete str;
当我删除指向对象的“str”时,是否会调用两个析构函数-一个用于指针本身,另一个用于它所指向的对象?
指针的析构函数会执行什么操作?
delete
的作用是销毁给定指针所指向的对象(在本例中就是string
对象)。指针本身由str
表示,具有自动存储期,当其像任何其他局部变量一样超出其作用域时将被销毁。
然而,请注意,非类类型没有析构函数。因此,即使您对非类类型使用delete
,也不会调用析构函数,但是当指针超出其作用域时,它将像任何其他自动变量一样被销毁(这意味着指针仅到达其生命周期的末尾,尽管指针指向的内存未被释放,直到您使用delete
显式释放它)。
delete
语句销毁。但是,像任何作用域变量一样,它在作用域结束时被销毁。void Function()
{
string * str=new string;
delete str; // <-- here the string is destructed
} // <-- here the pointer is "destructed", which is mean it's memory freed from the stuck but no actual destruction function is called..
class
或struct
定义的实体),而不适用于普通类型,例如指针。指针的生存方式与int
变量相同。像你所举的std::string*
的裸指针一样,其析构函数是平凡的(就像其他原始类型:int
、double
等的析构函数一样)。
智能指针类具有非平凡的析构函数,可以执行释放资源、调整引用计数等操作。
我喜欢从每种类型都有一个析构函数的概念中获得的简化。这样,即使存储值的类型是 int
或指针,模板明确销毁存储的值时也不会出现精神上的故障:
template <class T> struct wrapper {
unsigned char data[sizeof(T)];
wrapper(T t) { ptr = new (data) T; }
~wrapper() { (T*)&data->~T(); } // ignore possible alignment problem
wrapper<int> i(3);
然而,对于int
和指针的析构函数是非常微不足道的:它们什么也不做,也没有任何地方可以查看析构函数的定义,因为这个定义不存在。因此,合理地说它们没有析构函数。
无论哪种方式,当指针超出作用域时,它只是消失了;没有特殊的代码运行。