[英]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分配更多的內存,但是我能夠訪問它。 任何人都可以向我解釋一下,或者至少給我一份與之接近的解釋/參考/指南。
既pstruct
和pstruct2
指向存儲器中的相同的位置(由於您分配存儲在地址ptr
兩者),從而由所述插入的數據MyStruct::store
方法是由覆蓋MyStruct2::store
方法。
換句話說,這是因為您明確地使之成為現實。 如果您的兩個類不相同,或者編譯器產生了不同的內存布局,則可能會讀取垃圾數據。
基本上,C ++允許您根據需要寫入任意動態分配的內存,愉快地無知並且忽略了您之前曾將該內存用於另一個對象的事實。
未定義的行為,恰好成功地假裝它起作用。
3.10左值和右值[basic.lval]
...
10如果程序嘗試通過以下類型之一以外的glvalue訪問對象的存儲值,則行為未定義:
—對象的動態類型
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.