最近在做一个DLL导出类,这个类的数据成员有int,bool,和double*三种类型,做好了DLL/lib/h之后,在win32-console程序中调用,一切正常,这个类使用Initialize函数初始化成员,在Initialize退出前,使用VC查看局部变量,其数据成员及属性值如下图一:
返回到主程序的main函数内,也就是initialize函数调用完成之后,这个类的实例的内部成员如下图2所示:可以看到,最下面三个double*型变量的地址和内容都没变化。然后在一个有界面的MFC程序内部使用这个类,当定义一个这个类型的变量并且调用initialize初始化的时候,在initialize退出前,其数据成员如下图三:
此时,这个类的数据成员正确的完成了初始化;然后从initialize返回到主程序后,这个实例的某些成员发生了变化:
看上去,在MFC程序中,从类的方法调用返回到主程序时,数据成员发生了不希望的错误的变化。请教,这是怎么回事?应该如何避免这种情况?/?

解决方案 »

  1.   

    cpp对象的地址没有乱掉。看起来像是下面3个double*指向了局部变量的地址。
      

  2.   


    这个类是在DLL中定义的,因此Initialize函数也是在DLL中定义,在应用程序中导出的,在DLL中申请的一块内存,导出到应用程序里面有什么注意事项么?
      

  3.   

    问题解决了,发现是定义cpp那个类的工程,设置内存对齐方式有问题……修改了内存对齐方式后就OK了。
    具体发生了什么还得花点时间思考,总之是float和double变量赋值/转换造成的问题……
    好大的教训。
      

  4.   


    float和double的精度不一致,所占内存当然不一致。不过我不太明白的是为什么要手动去设置内存对齐,通常情况下,编译器自动做对齐能解决90%的以上的问题。
      

  5.   


    我的世界观告诉我影响相信编译器的。因为DLL不是我开发的,所以不知道开发DLL的的VC 工程 是怎样设置内存对齐选项的。我自己做了个实验,都是用默认设置,于是截图展示的问题出现了。看来必须手动做一些事情,不能想当然的叫编译器去完成一些工作。我想我的问题,就在10%里……
      

  6.   

    俺也是这样搞定了
    project/setting 
    c/c++ 
    category/code   generation 
    structure   member   alignment 
    选择1   byte