2017-04-12 14 views
-1

我只是在C++ 11中編寫了一些小代碼,並且遇到了我無法理解輸出的情況。 對於下面的代碼構造函數只會調用一次而析構函數被多次調用。如果我將刪除[] p刪除p它的行爲正確,但爲什麼刪除[] p是給這種輸出?對於類型爲shared_ptr的對象,desructor被多次調用創建的單個對象

#include <iostream> 
#include <memory> 

class MyClass{ 
public: 
    MyClass(){std::cout<<"Constructor called..."<<std::endl;} 
    ~MyClass(){std::cout<<"Destructor called..."<<std::endl;} 
    void printMe(){std::cout<<"PrintMe called..."<<std::endl;} 
}; 

int main(){ 
    std::shared_ptr<MyClass> ptr = std::shared_ptr<MyClass>(new MyClass(), 
    [](MyClass *p){std::cout<<"Custom Deleter ..for p"<<std::endl; delete[] p;}); 
} 

回答

0

您的程序有未定義的行爲。

您正在使用new MyClass()分配內存,然後使用delete [] p將其刪除。

只使用delete p;

int main(){ 
    std::shared_ptr<MyClass> ptr = std::shared_ptr<MyClass>(new MyClass(), 
    [](MyClass *p){std::cout<<"Custom Deleter ..for p"<<std::endl; delete p;}); 
} 
+0

@R Sahu是的我明白,**刪除p **是在這種情況下正確的方法和**刪除[] p **創建一個對象數組。當我創建一個對象數組並執行** delete [] p **時,它的行爲正確。但爲什麼這個特定的情況是不確定的(如果有的話)。如果行爲未定義,智能指針的概念是否會丟失? –

+0

@krishnakumarmandal,'shared_ptr'負責維護對象的生命週期。它將確保在對象的生命週期結束時調用刪除器。 'shared_ptr'沒有(不能)控制刪除者如何刪除對象。這意味着,刪除者必須做正確的事情來刪除對象。 –