2015-06-23 100 views
0

我正在使用VS2012。
我将代码从原始指针移植到unique_ptr并面临问题。
在这里,我试图模拟场景:具有虚拟和非虚拟功能的unique_ptr :: get()函数

class xyz{ 
    public: 
    virtual int getm(); 
    int get();  
    static std::unique_ptr<xyz> returnbase(); 
}; 

class abc:public xyz 
{ 
public: 
    int getm() {return 0;} 
}; 

std::unique_ptr<xyz> xyz::returnbase() 
{ 
    std::unique_ptr<xyz> u_Swift(nullptr); 
    u_Swift = std::unique_ptr<xyz>(dynamic_cast<xyz*>(new abc())); 
    return u_Swift; 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    xyz* x1 = xyz::returnbase().get(); 
    x1->get(); 
    x1->getm(); 
    return 0; 
} 

我得到一个崩溃“访问冲突”而调用虚函数。
我很惊讶,为什么这是崩溃的虚拟功能?

通过观察我可以看到分配后虚拟指针已损坏。但为什么这是腐败的,我很好奇。

+0

格式化你的代码。 –

+0

为什么你写这样一个非常冗长的代码?例如'returnbase()'应该由一个语句组成:'return std :: unique_ptr (dynamic_cast (new xyz()));' –

+4

将'new xyz()'铸造成'xyz *'?它已经是'xyz *'了。 – Wintermute

回答

6

您的x1是一个悬挂指针,因为拥有其初始指针的临时唯一指针在main的第一个语句末尾被销毁,因此指针被破坏。

xyz* x1 = xyz::returnbase().get(); 
//  ^^^^^^^^^^^^^^^^^  ^^ 
//   temporary object  ^-- destroyed here 

要保留的对象,你需要使它非暂时性的,就像这样:

int main() 
{ 
    std::unique_ptr<xyz> thing = xyz::returnbase(); 
    xyz * x1 = thing.get(); 

    // ... use x1 and *x1 ... 

} // thing goes out of scope and *thing is destroyed