先说说我的问题:
我定义了一个对话框类:CDlgpoint;
里面的一个成员是我自定义的结构体:
先写出我的结构体,里面需要存一个字符串,我是在结构体构造函数中申请内存空间;
如下:
#define LEN 100
STRUCT struct_my
{
char *name;
//构造函数
struct_my
{
name = new char[LEN ];
}
//析构函数就不写出来了;
}
我的子对话框类CDlgpoint如下,里面定义了一个结构体struct_my的成员:
CDlgpoint
{
public:
struct_my m_struct_my;
}
在CDlgpoint的构造函数中,给m_struct_my的name赋值,如下:
CDlgpoint(Cstring str)
{
m_struct_my.name = str;
}
在我的主对话框中:需要生成两个CDlgpoint的子对话框:
我先定义:
CDlgpoint *dlg1;
CDlgpoint *dlg2;
然后
dlg1 = new CDlgpoint("123");
dlg1.creat();
dlg1.show();
dlg2 = new CDlgpoint("456");
dlg2.creat();
dlg2.show();
本想两个子对话框的name会不同:可是问题出现了:
用断点进去看。
dlg1.name = "456";
dlg2.name = "456";
测试了一下:
如果再增加一个"789"子对话框,
dlg1 = new CDlgpoint("123");
dlg2 = new CDlgpoint("456");
dlg3 = new CDlgpoint("789");
则:
dlg1.name = "789";
dlg2.name = "789";
dlg3.name = "789";
也就是说最后是最后一次的值;我本以为类在生成实例时,会相对有独立的数据空间,如果定义一个普通的变量,就
不会有问题,偏偏是这个结构体中动态分配内存变量就有问题;我看了下,dlg1、dlg2、dlg3 name的内存地址都是一
样的,我觉得应该会不一样啊。请大家给我解释下吧!!
------解决方案--------------------
你自己对问题都一点不负责,调试你贴哪代码,我还得猜你是怎么写的,把错误和没写全的地方给补上,你还根本没理解指针,按你代码执行,
这个构造函数里的new没有没执行,只是name指向了函数作用域内开辟的空间
dlg1 = new CDlgpoint("123");
dlg2 = new CDlgpoint("456");
dlg3 = new CDlgpoint("789");
"123"的内存空间在 dlg1在new的时候开辟,new完以后"123"内存空间被释放,
"456"依然是在"123"的位置被开辟空间,后面也是一样,
所以最后执行完以后dlg1,dgl2,dlg3的name都是指向同一个内存地址,值当然是最后的那个值,
也许我说的不准,因为你哪代码不全,我也没法还原成你写的那个样子,我没法把原因分析准确,我怎么知道具体你是怎么写的。