簡體   English   中英

內存在C ++中共享嗎?

[英]Memory is being shared in C++?

自從我弄亂了以下代碼以來,有人可以向我解釋如何利用數據...:

#include <stdio.h>
#include <stdlib.h>

typedef struct MyStruct {
public:
    void print() {
        printf("MyStruct.print():\n\ta: %i\n\tb: %i\n\n", a, b);
    }
    void store() {
        a = 2;
        b = 3;
    }
private:
    int a, b;
};

typedef struct MyStruct2 {
public:
    void print() {
        printf("MyStruct2.print():\na: %i\nb: %i\n\n", a, b);
    }
    void store() {
        a = 1024;
        b = 3077;
    }
private:
    int a, b;
};

int main() {
    void *ptr = malloc(sizeof(MyStruct)); // sizeof(MyStruct) == sizeof(MyStruct2)
MyStruct* pstruct = (MyStruct*)ptr;

pstruct->store();
pstruct->print();

MyStruct2* pstruct2 = (MyStruct2*)ptr;

pstruct2->store();
pstruct->print();

return 0;
}

我得到以下結果:

MyStruct.print():
        a: 2
        b: 3

MyStruct.print():
        a: 1024
        b: 3077

如您所見,我沒有為pstruct2分配更多的內存,但是我能夠訪問它。 任何人都可以向我解釋一下,或者至少給我一份與之接近的解釋/參考/指南。

pstructpstruct2指向存儲器中的相同的位置(由於您分配存儲在地址ptr兩者),從而由所述插入的數據MyStruct::store方法是由覆蓋MyStruct2::store方法。

換句話說,這是因為您明確地使之成為現實。 如果您的兩個類不相同,或者編譯器產生了不同的內存布局,則可能會讀取垃圾數據。


基本上,C ++允許您根據需要寫入任意動態分配的內存,愉快地無知並且忽略了您之前曾將該內存用於另一個對象的事實。

未定義的行為,恰好成功地假裝它起作用。

3.10左值和右值[basic.lval]

...

10如果程序嘗試通過以下類型之一以外的glvalue訪問對象的存儲值,則行為未定義:

—對象的動態類型

暫無
暫無

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

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