C ++需è¦æžæž„函数

时间:2013-05-27 17:49:01

标签: c++ destructor

What is The Rule of Three?æåŠ

  

执行æžæž„函数体并破åä»»ä½•è‡ªåŠ¨å¯¹è±¡åŽ Â Â åœ¨ä¸»ä½“å†…åˆ†é…,类Xçš„æžæž„函数调用æžæž„函数   X的直接æˆå‘˜[n3126.pdf12.4§6]

这让我想知é“,如果ä¸ç ´åæˆå‘˜ï¼Œä½¿ç”¨æžæž„函数有什么用?请æ供示例

5 个答案:

答案 0 :(得分:3)

æˆå‘˜æœ¬èº«ä¸è´Ÿè´£è¿›è¡Œé¢å¤–的清ç†å·¥ä½œã€‚或者在资æºç®¡ç†çš„情况下,确ä¿ä¸Žå¯¹è±¡å…³è”的资æºè¢«æ­£ç¡®é‡Šæ”¾ã€‚请记ä½ï¼Œå¹¶éžæ‰€æœ‰æˆå‘˜éƒ½å…·æœ‰å°†è¢«è°ƒç”¨çš„æžæž„函数(指针没有æžæž„函数)。因此,如果您有指针,则需è¦æ‰‹åŠ¨ç®¡ç†å®ƒä»¬ã€‚

带指针的示例资æºç®¡ç†ã€‚

shared_ptr::~shared_ptr()
{
    if (decrementReferenceCountAndCheckForZero())
    {
        cleanupResources();
    }
}

实施例。使用框架。没有æˆå‘˜çŸ¥é“框架,但工人知é“。

MyWorker::MyWorker()
{
     Framwork::Register(this);
}
MyWorker::~MyWorker()
{
    Framework::Unrigester(this);
}

答案 1 :(得分:2)

与对象ä¸å†å­˜åœ¨æ—¶éœ€è¦è§£é™¤å…³è”/释放/特殊处ç†çš„类实例关è”的任何内容。
几个例å­ï¼š

  • 文件å¥æŸ„由实例打开,拥有和使用,ä¸ä¼šåœ¨å¯¹è±¡é”€æ¯åŽä½¿ç”¨ã€‚
  • Socktes,mutex等由类实例打开并拥有。

答案 2 :(得分:1)

所有声明的æ„æ€æ˜¯å¦‚果你有一个æžæž„函数定义为

Foo::~Foo()
{
    Bar b;
    b.do_whatever();
}

然åŽb对象的æžæž„函数在任何Fooæˆå‘˜çš„æžæž„函数之å‰è¿è¡Œã€‚执行æžæž„函数的主体,并首先销æ¯åœ¨ä¸»ä½“内分é…的自动对象,å³b。

答案 3 :(得分:1)

您的类å¯èƒ½ä¼šé€šè¿‡è°ƒç”¨å¯¹è±¡çš„æ•°æ®æˆå‘˜çš„æžæž„函数æ¥ç®¡ç†æœªå‘布的资æºã€‚如果是这样,那么释放资æºçš„代ç å±žäºŽæ‚¨ç¼–写的æžæž„函数。

例如,如果您使用new分é…对象,则必须使用delete释放它们。如果您使用fopen打开文件,则会使用fclose关闭该文件。如果您使用pthread_mutex_lock获å–Posix互斥é”,则必须将其与pthread_mutex_unlock一起å‘布。

对于æ¯ç§èµ„æºéœ€æ±‚,您(或其他人)å¯ä»¥ç¼–写一个管ç†å’Œé‡Šæ”¾è¯¥èµ„æºçš„类,并æ供对其基本æ“作的访问。因此存在类std::unique_ptr,std::shared_ptr,std::lock_guard,std::fstream等类。当然,为简å•èµ·è§ï¼Œæ‚¨é€šå¸¸å¸Œæœ›åªæœ‰ä¸€ä¸ªç±»æ¥ç®¡ç†ç‰¹å®šç±»åž‹çš„资æºã€‚因此,由于{C} 11中存在std::lock_guard,因此您编写自己的类以释放互斥é”的唯一原因是,如果您è¦ä¸ºæ ‡å‡†ç‰ˆæ供一些替代接å£ã€‚ç†æƒ³æƒ…况下,éžé»˜è®¤æžæž„函数的类在您自己的代ç ä¸­åº”该很少 - 通常已ç»å­˜åœ¨å¯ç”¨ä½œæ•°æ®æˆå‘˜æˆ–自动å˜é‡çš„类,并且其æžæž„函数å¯ä»¥å®Œæˆè¿™é¡¹å·¥ä½œã€‚

答案 4 :(得分:0)

è¿™å¯èƒ½å¯¹æ‚¨æœ‰æ‰€å¸®åŠ©

å‡è®¾ä¸€ä¸ªç±»å…·æœ‰åŠ¨æ€åˆ›å»ºçš„someClass数组。在你的构造函数中å‡è®¾ä½ åˆ›å»ºäº†

someClass * p = new someClass [10] ;

然åŽåœ¨æžæž„函数中你会写

delete []p ;