当指针超出范围时,其内存被释放,那么为什么要用destructor
c ++创建?
如果你问为什么C++类有析构函数,那么某些类除了释放内存之外还有其他要求.例如,您可能有一个分配了一个需要干净地关闭的套接字连接的对象.
此外,"unscoping"指针并没有释放它指向的,因为其他指针可以参考它的内存.
如果堆栈上有指针,退出该函数将释放指针使用的内存,但不释放指针指向的内存.有一个微妙但非常重要的区别.
当指针超出范围时,指针占用的内存将被释放.指针占用的4或8字节(通常)内存,即.
当指针超出范围时,指针指向的对象(或其他内存)不会被释放.你通过删除指针来做到这一点.如果有的话,它会调用析构函数.
首先,您错误地指出当指针超出范围时释放内存.如果原始指针为false,则内存将丢失,并且指向对象持有的任何资源都将丢失.
析构函数是该语言的核心特征,也是用于资源管理的RAII习惯用语的基础.对象在构造期间获取资源并在析构函数中释放相同的资源.它是一种简单,可控且简单的资源管理方法.请注意,资源是来自内存的任何东西(智能指针析构函数释放它们控制的内存,容器释放其内部内存结构)或任何其他资源(ofstreams释放打开的文件,数据库连接释放套接字).
使用C#或Java内存的托管语言由垃圾收集器自动释放时,只有内存才能被释放,并且用户可以在使用位置手动控制所有其他资源.
如果在C#/ Java中检查异常控制结构,您会注意到C++中存在一个不存在的finally子句.原因是托管语言必须为用户提供一个代码块,保证执行该代码块以手动释放资源.释放资源的压力放在使用库的程序员中.
在C++中,使用RAII习语,每个对象负责它所持有的资源,并且必须在销毁期间释放它们.这意味着如果您在堆栈中使用对象,则会在没有用户交互的情况下释放资源.控制资源的责任在于类中,用户不能记得手动释放每个资源.
许多托管语言被告高兴地说,不必记住何时何地释放内存,因为它将被垃圾收集器声称是一个很大的优势,但他们不会讨论如何控制其他资源.内存管理只是资源管理问题的一个子集,同样的解决方案也适用.如果你在智能指针内部保存内存(std :: auto_ptr,boost :: shared_ptr,std :: tr1 :: unique_ptr,std :: tr1 :: shared_ptr ...,选择适合你用途的那个),那么将管理内存为了你.
虽然这篇文章似乎已经从最初的析构函数问题中摒弃了,但它确实非常密切相关.所有资源控制必须在析构函数中执行,即智能指针的工作方式:当堆栈分配的智能指针超出范围时,析构函数被调用,并检查是否必须释放堆(新)分配的内存,如果是,则删除是调用.但话说回来,这只是更普遍问题的一个子集.