内存是在C ++中共享的?

时间:2012-12-08 22:49:30

标签: 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分配更多内存,但我能够访问它。任何人都可以向我解释,或者至少给我一个参考/教程来解释它的内容。

2 个答案:

答案 0 :(得分:4)

pstructpstruct2都指向内存中的相同位置(因为您已将ptr中存储的地址分配给两者),因此MyStruct::store插入的数据方法被MyStruct2::store方法覆盖。

换句话说,这种情况正在发生,因为您明确地实现了它。如果你的两个类不相同或者编译器产生了不同的内存布局,你可能会读出垃圾数据。


基本上,C ++允许您根据需要写入任何动态分配的内存,很高兴无知并且忘记了之前将此内存用于其他对象的事实。

答案 1 :(得分:0)

未定义的行为,碰巧成功地假装它有效。

  

3.10左值和右值[basic.lval]

     

...

     

10如果程序试图通过glvalue以外的方式访问对象的存储值   行为未定义的以下类型之一:

     

- 对象的动态类型