在运行时更改类成员的值,这是哪种错误

value of a class member be changed in run time, which kind of error is it?

本文关键字:错误 运行时 成员      更新时间:2023-10-16

我的代码是这样的:

class myclass
{
public:
   char someinfo[100];
   void dosomething();
}
void myclass::dosomething()
{
   TRACE("someinfo : %s", someinfo);
   //do something
}
int main(int argc, char *argv[])
{
    myclass* obj = new myclass;
    strncpy(obj->someinfo, "hello,world", 100);
    TRACE("someinfo : %s", obj->someinfo);
    obj->dosomething();
    delete obj;
}   

两个 TRACE 的结果是这样的:

someinfo: hello,world
someinfo: ello,world

惠克类型的错误会导致这种情况吗?这很奇怪。

我已经找到了原因.如果这样做,它应该会导致此错误:

  1. 将上面的代码写入三个文件:main.cpp,myclass.h,myclass.cpp
  2. make, get
  3. main.o, myclass.o; link, get out file test.out
  4. 编辑 myclass.h 和 myclass.cpp,在"char someinfo[100];"之前添加一个布尔类型成员;
  5. 只需制作myclass.o,并链接,获得新的测试。
  6. 现在,如果您执行test.out,则会发生此错误。

我已经找到了原因.如果这样做,它应该会导致此错误:

  • 将上面的代码写入三个文件:main.cpp,myclass.h,myclass.cpp
  • make, get
  • main.o, myclass.o; link, get out file test.out
  • 编辑 myclass.h 和 myclass.cpp,在"char someinfo[100];"之前添加一个布尔类型成员;
  • 只需制作myclass.o,并链接,获得新的测试。
  • 现在,如果您执行test.out,则会发生此错误。

是的。如果更改多个翻译单元共有的结构的布局,但仅重新编译其中一个,则代码中存在类型差异。

你的程序有一半有一个定义,另一半有另一个定义。C 字符串位于一个位置,但一半的程序认为它在内存中比实际早一个字节。难怪它不能正常工作!

[C++11: 3.2/5]明确禁止您所做的一切。

习惯于在更改头文件时重新生成整个项目