先说说我的问题:
我定义了一个对话框类: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的内存地址都是一
样的,我觉得应该会不一样啊。请大家给我解释下吧!!
4 个解决方案
#1
dlg3.name="some string"//这里的somestring 是const string
c++ 你要对char[]类型赋值需要strcpy,或者你用cstring
c++ 你要对char[]类型赋值需要strcpy,或者你用cstring
#2
我用的是memcpy;没有直接赋值如下:
我在dlg3的构造函数中,传入主对话框的指针this,主对话框中也有一个struct_my的变量,假如为struct_main,然后再dlg3得构造函数中:
CDlgpoint (param)
{
CMainDlg *p = (CMainDlg *)param;
memcpy(dlg3.name,param.name,sizeof(struct_my));
//本想这样在生成没哟个子对话框时,修改了struct_main.name。每个子对话框的name应该就会不同,可是不是这样,先前dlg1,dlg2,name的内容同时也被修改成dlg3.name的内容,请答复!!
//我觉得是dlg1、2、3的name的共享了一块内存空间,是这个原因引起的
}
我在dlg3的构造函数中,传入主对话框的指针this,主对话框中也有一个struct_my的变量,假如为struct_main,然后再dlg3得构造函数中:
CDlgpoint (param)
{
CMainDlg *p = (CMainDlg *)param;
memcpy(dlg3.name,param.name,sizeof(struct_my));
//本想这样在生成没哟个子对话框时,修改了struct_main.name。每个子对话框的name应该就会不同,可是不是这样,先前dlg1,dlg2,name的内容同时也被修改成dlg3.name的内容,请答复!!
//我觉得是dlg1、2、3的name的共享了一块内存空间,是这个原因引起的
}
#3
、 memcpy(dlg3.name,param.name,sizeof(struct_my));
能不能正确的把你的代码贴出来,
dlg3何来的name字段?
还有
CDlgpoint(Cstring str)
{
m_struct_my.name = str; 不能直接把cstring 赋给 char*
}
能不能正确的把你的代码贴出来,
dlg3何来的name字段?
还有
CDlgpoint(Cstring str)
{
m_struct_my.name = str; 不能直接把cstring 赋给 char*
}
#4
你自己对问题都一点不负责,调试你贴哪代码,我还得猜你是怎么写的,把错误和没写全的地方给补上,你还根本没理解指针,按你代码执行,
这个构造函数里的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都是指向同一个内存地址,值当然是最后的那个值,
也许我说的不准,因为你哪代码不全,我也没法还原成你写的那个样子,我没法把原因分析准确,我怎么知道具体你是怎么写的。
这个构造函数里的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都是指向同一个内存地址,值当然是最后的那个值,
也许我说的不准,因为你哪代码不全,我也没法还原成你写的那个样子,我没法把原因分析准确,我怎么知道具体你是怎么写的。
#1
dlg3.name="some string"//这里的somestring 是const string
c++ 你要对char[]类型赋值需要strcpy,或者你用cstring
c++ 你要对char[]类型赋值需要strcpy,或者你用cstring
#2
我用的是memcpy;没有直接赋值如下:
我在dlg3的构造函数中,传入主对话框的指针this,主对话框中也有一个struct_my的变量,假如为struct_main,然后再dlg3得构造函数中:
CDlgpoint (param)
{
CMainDlg *p = (CMainDlg *)param;
memcpy(dlg3.name,param.name,sizeof(struct_my));
//本想这样在生成没哟个子对话框时,修改了struct_main.name。每个子对话框的name应该就会不同,可是不是这样,先前dlg1,dlg2,name的内容同时也被修改成dlg3.name的内容,请答复!!
//我觉得是dlg1、2、3的name的共享了一块内存空间,是这个原因引起的
}
我在dlg3的构造函数中,传入主对话框的指针this,主对话框中也有一个struct_my的变量,假如为struct_main,然后再dlg3得构造函数中:
CDlgpoint (param)
{
CMainDlg *p = (CMainDlg *)param;
memcpy(dlg3.name,param.name,sizeof(struct_my));
//本想这样在生成没哟个子对话框时,修改了struct_main.name。每个子对话框的name应该就会不同,可是不是这样,先前dlg1,dlg2,name的内容同时也被修改成dlg3.name的内容,请答复!!
//我觉得是dlg1、2、3的name的共享了一块内存空间,是这个原因引起的
}
#3
、 memcpy(dlg3.name,param.name,sizeof(struct_my));
能不能正确的把你的代码贴出来,
dlg3何来的name字段?
还有
CDlgpoint(Cstring str)
{
m_struct_my.name = str; 不能直接把cstring 赋给 char*
}
能不能正确的把你的代码贴出来,
dlg3何来的name字段?
还有
CDlgpoint(Cstring str)
{
m_struct_my.name = str; 不能直接把cstring 赋给 char*
}
#4
你自己对问题都一点不负责,调试你贴哪代码,我还得猜你是怎么写的,把错误和没写全的地方给补上,你还根本没理解指针,按你代码执行,
这个构造函数里的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都是指向同一个内存地址,值当然是最后的那个值,
也许我说的不准,因为你哪代码不全,我也没法还原成你写的那个样子,我没法把原因分析准确,我怎么知道具体你是怎么写的。
这个构造函数里的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都是指向同一个内存地址,值当然是最后的那个值,
也许我说的不准,因为你哪代码不全,我也没法还原成你写的那个样子,我没法把原因分析准确,我怎么知道具体你是怎么写的。