struct中某一变量是用CString类型还是char数组类型?struct Mystruct
{
int ID;
CString Name;
int orderno;
};我感觉应用char数组类型,但CString 类型是否不好存储之类的;另外用了CString类型,是否memcpy 此struct变量有问题?
delete Mystruct是否有对CString对象释放不掉的情况?

解决方案 »

  1.   

    CString 实际上是MFC封装好的一个字符结构,
    如果你的程序是用MFC,那这样是完全没有问题的,
    如果是普通的C++/C程序,这样就会有问题了
      

  2.   

    还是用char数组好
    至少用char数组的话,占的空间小
      

  3.   

    我想应该没有问题,CString 变量在结构中存在的只是他的首地址,和定义一个char数组没有什么区别
    例如:
    struct MYSTRUCT {
    CString strName;
    CString strSex;
    CString strAge;
    };
    MYSTRUCT st;
    int size = sizeof(st);
    size的结果是12,也就是每个CString 对象在结构体中存放的只是他们的指针2、应该不会发生这中情况,我想CString的析构函数应该会完成内存的释放
      

  4.   

    用char安全,cstring可能会出问题。。
      

  5.   

    Name如果没有变化范围,使用数组,否则使用CString,或者char*,都没什么问题,注意使用char*的时候最好加一个Attach和Detach函数,负责把该字符串指针和一个字符串指针联系起来,这样的话,你就可以在析构函数中把它释放掉了,否则容易造成多次释放
    另外使用CString或者char*就不能用memcpy而应该重新定义copy函数
    基本就说这么多吧
      

  6.   

    如果有CString的话,不要用memset来清零,否则会出错的
      

  7.   

    对,可以把CString看作是char*一样对待。
      

  8.   

    都可以,MFC用CString.
    c/c++用char
      

  9.   

    (1)to  flyelf(空谷清音):
    ===================================================
    如果有CString的话,不要用memset来清零,否则会出错的
    ===================================================
    确实如此!但能说明原因吗?
    (2)to bluebohe(薄荷) ( ) :
    ======================
    另外使用CString或者char*就不能用memcpy而应该重新定义copy函数
    ======================
    能解释一下原因吗?我感觉我这个地方有点模糊!谢谢!(3)to bluebohe(薄荷) ( ) :
    ======================
    char*的时候最好加一个Attach和Detach函数,负责把该字符串指针和一个字符串指针联系起来,这
    样的话,你就可以在析构函数中把它释放掉了,否则容易造成多次释放
    =====================
    能给个小例子吗?不好意思,这摸多高手参与,分太少,等揭贴后我单独再加分!!
    大家共同进步呀!!!!
      

  10.   

    如果使用CString或者char*的话,memcpy仅仅拷贝了指针值,使两个结构体中的字符串指针指向相同,你删除其中一个结构的时候,另一个结构里面的字符串指针就不能用了,所以你应该用copy函数去重新为另一个结构的字符串指针申请空间。
    Attach是把结构体中的字符串指针赋值,Detach负责给结构体中的字符串指针清空,这样的话,如果你new了一个空间通过Attach赋值给结构体中字符串指针时,不Detach的话,可以通过析构结构体释放字符串指针,而你Detach时,结构体中的字符串指针赋空,就可以在外部删除new出来的字符串指针,这样的话程序看起来比较有条理。
      

  11.   

    我来解决你关于
    (1)to  flyelf(空谷清音):
    ===================================================
    如果有CString的话,不要用memset来清零,否则会出错的
    ===================================================
    确实如此!但能说明原因吗?的疑问:
    主要是因为,CString中会自动调用CString::GetData()函数。如:赋值时、析构时
    而GetData()函数的第一行就是ASSERT(m_pchData != NULL);
    这句话的意思就是在进行后面的操作前确保改CString对象的m_pchData指针不为空,否则报错。
    而你的memset操作恰恰将其指向了空。所以程序会不知不觉崩掉。
    这也提醒我们,在对类内成员进行操作的时候,最好是通过类为我们提供的接口进行,而不要自作主张。(也就是封装的思想)
      

  12.   

    其实类似问题很容易用VC的IDE的debug工具找到答案,想成为高手的话就要善于通过一切有可能的手段获取答案。