在c ++中有指针的析构函数吗?

时间:2013-05-08 09:13:44

标签: c++ pointers

string * str=new string;
delete str;

当我删除指向一个对象的'str'时,会调用两个析构函数 - 一个用于指针本身,一个用于指向它的对象?

指针的析构函数会做什么?

6 个答案:

答案 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)

析构函数的概念仅适用于对象(即使用classstruct定义的实体),而不适用于普通类型,如指针。指针就像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*的示例一样,是微不足道的(就像其他原始类型的析构函数一样:intdouble等。)

智能指针类具有非平凡的析构函数,可以执行诸如自由资源,调整引用计数等操作。