【筆試題】深拷貝與淺拷貝(二) -开发者知识库

【筆試題】深拷貝與淺拷貝(二) -开发者知识库,第1张

剛看到一道同類型的,一起搬上來了。。。

#include <iostream> 

class A {  
    int i;  
};  

class B {  
    A *p;  
public:  
    B() { p = new A; }  
    ~B() { delete p; }  
};  

void sayHello(B b) {  

}  

int main()  
{  
    B b;  
    sayHello(b);  

    return 0;  
}  

題中的代碼如上,問題是上面的代碼是否存在問題?

這題考到了兩個知識點,一個是函數調用的值傳遞過程(函數中的參數是實際參數的一份拷貝),另一個就是關於深、淺拷貝。

函數形參傳遞了類對象b, 淺拷貝一個臨時對象,在將一個對象賦值給另一個對象時,對象的數據成員間值將進行簡單的拷貝,而其中的指針也將進行拷貝,這時候兩個指針不同,但指向的對象相同,所以當函數執行結束,對臨時對象析構的時候,指針指向的對象將被delete,而程序執行完畢之后,又會對b進行析構,這時再次delete,於是引發錯誤。

改錯:

">#include <iostream>  

class A {  
    int i;  
};  

class B {  
    A *p;  
public:  
    B() { p = new A; }  
    B(const B& copy){ 
        if(copy.p)
        {
            p = new A;
            memcpy(p, copy.p, sizeof(A)); 
        }  
    ~B() { delete p; }  
};  

void sayHello(B b) {  

}  

int main()  
{  
    B b;  
    sayHello(b);  

    return 0;  
}  

最佳答案:

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
U19学习网站 » 【筆試題】深拷貝與淺拷貝(二) -开发者知识库