-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;});
}
@R Sahu是的我明白,**刪除p **是在這種情況下正確的方法和**刪除[] p **創建一個對象數組。當我創建一個對象數組並執行** delete [] p **時,它的行爲正確。但爲什麼這個特定的情況是不確定的(如果有的話)。如果行爲未定義,智能指針的概念是否會丟失? –
@krishnakumarmandal,'shared_ptr'負責維護對象的生命週期。它將確保在對象的生命週期結束時調用刪除器。 'shared_ptr'沒有(不能)控制刪除者如何刪除對象。這意味着,刪除者必須做正確的事情來刪除對象。 –