簡體   English   中英

C ++-淺復制指針。 為什么此代碼有效?

[英]C++ - Shallow copying a pointer. Why is this code working?

就我對主題的理解:淺表復制是將一個對象的非指針類型復制到另一個對象時的情況。 當對象具有指針時,無法進行淺表復制,因為被復制的對象將獲得該指針的地址,並且當兩個對象中的任何一個被刪除時,另一個將懸而未決,因為它們指向相同的位置在記憶中。 當涉及到指針時,使用深拷貝,因為它保留了與原始對象空間分開的空間,並且僅將內容從一個內存位置復制到另一個內存位置。 這樣,當刪除一個對象時,其他對象就不會懸空。 就是說,即使我做了一個指針的淺表復制,我也想知道為什么這個程序能正常工作

struct aStruct {
    int *i;
    aStruct(int *p) : i(p) {
        cout << "Created aStruct" << endl;
    }
    aStruct(const aStruct &s) {
        cout << "Copying aStruct" << endl;
        i = s.i;
    }
    aStruct &operator=(const aStruct &s) {
        cout << "Assigning aStruct" << endl;
        i = s.i;
        return *this;
    }
};

int main() {
    int *x = new int(3);
    aStruct s1(x);
    aStruct s2 = s1;
    int *y = new int(4);
    aStruct s3(y);
    s3 = s1;
}

s1,s2和s3的變量i都指向同一位置。 因此,當main()函數的末尾到達並且其中一個被銷毀時,是否不應該讓另一個懸空而導致錯誤呢? 我的程序運行正常。 有人能請客給我解釋一下嗎?

謝謝大家

您正在復制指針,而不是數據。 這里的每個對象本身就是一個對象,此外,您似乎對C ++產生了垃圾回收印象。 並非如此 (在某些不常見的實現中除外)

您的程序基本上會泄漏內存,並且只能通過操作系統釋放終止程序后釋放的所有進程來清理。 因此,在應用程序的整個生命周期中,所有指針都指向完全有效的內存。

不幸的是,C ++中沒有深度和淺指針的概念。 Java和C#中的引用概念不同於C ++中的指針。 你應該繼續讀

用這種方式,在C ++中,指針指向指針所指向的內存位置中的任何對象。

因此,您正在做的就是將分配的位置復制到構造函數中到對象中...當析構函數運行時,整個對象都會從內存中釋放(死),包括指針int* i它是數據成員)。 但是new分配的內存位置不會被釋放,直到有人用delete調用該位置為止。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM