string * str=new string;
delete str;
当我删除指向一个对象的'str'时,会调用两个析构函数 - 一个用于指针本身,一个用于指向它的对象?
指针的析构函数会做什么?
答案 0 :(得分:15)
delete
只会导致给定指针指向的对象被销毁(在本例中为string
对象。指针本身,由str
表示,具有自动存储功能持续时间,当它超出范围时将被销毁,就像其他任何局部变量一样。
但请注意,非类类型没有析构函数。因此,即使将delete
与非类型类型一起使用,也不会调用析构函数,但当指针超出范围时,它会像其他任何自动通常一样被破坏变量(意味着指针刚刚到达其生命周期的末尾,尽管指针指向的内存未被释放,直到使用delete
显式释放它。)。
答案 1 :(得分:4)
它自己的指针没有被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..
答案 2 :(得分:3)
析构函数的概念仅适用于对象(即使用class
或struct
定义的实体),而不适用于普通类型,如指针。指针就像int
变量一样。
答案 3 :(得分:1)
当我删除指向一个对象的'str'时,会调用两个析构函数 - 一个用于指针本身,一个用于指向它的对象?
没有。 delete
接受一个指针参数。它会破坏指向的对象(使用它的析构函数,如果它有一个,否则什么也不做),并释放指向的内存。您之前必须使用new
来分配内存并在那里创建对象。
指针本身不受影响;但它不再指向有效的对象,所以你不能对它做任何事情。这有时被称为“悬空指针”。
指针的析构函数会做什么?
无。只有类类型有析构函数。
答案 4 :(得分:0)
我喜欢你从每个类型都有析构函数的概念中得到的简化。这样,即使存储的值的类型是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
和指针的析构函数完全无关紧要:它们什么都不做,而且没有地方可以去查看析构函数的定义,因为定义不存在。因此,说它们没有析构函数也是合理的。
无论哪种方式,当指针超出范围时,它就会消失;没有特殊的代码运行。
答案 5 :(得分:0)
原始指针的析构函数,就像std::string*
的示例一样,是微不足道的(就像其他原始类型的析构函数一样:int
,double
等。)
智能指针类具有非平凡的析构函数,可以执行诸如自由资源,调整引用计数等操作。