2012-07-12 63 views
0

在Microsoft Visual Studio 2010中使用sockaddr_storage时,有人遇到过内存损坏的情况吗?这是种代码,我有问题:当使用sockaddr_storage时,Visual Studio会破坏内存

class Base 
{ 
public: 
    Base(){a=1}; 
    int a; 
    sockaddr_storage addr; 
    int b; 
}; 

class Derived1 : public Base 
{ 
public: 
    Derived1() {a=2}; 
    int c; 
} 

class Derived2 : public Derived1 
{ 
public: 
    Derived2() {a=3;}; 
    int d; 
} 

在Derived2的构造方法的偏移量为“A”中的对象是4个字节关闭和设定“a”到3个腐化存储器。

Regards, Dusan Mudric。

+0

请提供一个完整的,自包含的示例来演示该问题。 – 2012-07-12 18:11:15

+0

究竟是什么让你认为存在内存损坏。你可以添加来自Visual Studio的错误或消息的文本,如果有的话? – 2012-07-12 18:12:21

+0

我拆开了代码并检查了内存。汇编代码在Derived2中的'a'的偏移量不同于Base中的偏移量。我可以看到Derived2在错误的内存位置设置了'a'的值。 – user1521589 2012-07-12 18:29:49

回答

0

使用下面的代码示例我无法重现您的问题。

#include <iostream> 
#include <WinSock2.h> 

class Base 
{ 
public: 
    Base(){a=1;} 
    int a; 
    sockaddr_storage addr; 
    int b; 
}; 

class Derived1 : public Base 
{ 
public: 
    Derived1() {a=2;}; 
    int c; 
}; 

class Derived2 : public Derived1 
{ 
public: 
    Derived2() {a=3;}; 
    int d; 
}; 

int main(int argc, char **argv) 
{ 
    Derived2 d; 
    std::cout << d.a << std::endl; 
    return 0; 
} 

如果您发布了一个完整的代码示例,可以重现问题,那么我们可能会提供更多帮助。

+0

代码太大,我无法发布。下面是反汇编代码,清楚地显示编译器错误: – user1521589 2012-07-12 18:31:39

+0

如果代码太大而无法发布,那么您将需要看到一个将重现该问题的测试用例。看到反汇编是没有用的,因为它不能使我们解决C++中的问题。 – ctor 2012-07-12 18:34:56

+0

这里是反汇编代码,清楚地显示编译器错误。在该示例中,偏移量是8字节不同的: 43:CDerived1 :: CDerived1(a):CBase(a) 45:{md_eType = eST_ONE; 01AB7A46 C7 80 A8 01 00 00 02 00 00 00 MOV DWORD PTR [EAX + 1A8h],2 32:CDerived2 :: CDerived2的(a) 33::CDerived1的(a) 37:{ 39:\t m_eType = eST_TWO; //为什么在作业后仍然是eST_ONE? 01BAB29D 8B 45 EC mov eax,dword ptr [ebp-14h] 01BAB2A0 C7 80 A0 01 00 00 04 00 00 00 mov dword ptr [eax + 1A0h],4 – user1521589 2012-07-12 18:46:30