我听人家说这种用法不推荐在项目里使用,可能会出错,是这样吗?
还有我定义这个长度为0的数组的时候编译出错,定义一个长度为1的就OK,这是怎么回事?

解决方案 »

  1.   

    你说的是不是 C++ 中的 new 和 delete 吧?
      

  2.   

    这种做法在内核里面多了,有什么问题吗还有我定义这个长度为0的数组的时候编译出错,定义一个长度为1的就OK,这是怎么回事?这个跟编译器有关,vc是要用1的
      

  3.   

    确实容易出错。
    比如你现在要申请一个存放结构体实例(其中变长数组长度为N)的内存空间,你要申请多少字节的内存?
    struct A
        {
        int nLen;
        char pBuf[1];
        };用VC编译时,如果编译时内存最大对齐模数设为默认,则要申请的内存字节数为:size_t nMaxAlign = sizeof(结构体中对齐要求最严格的类型);
    size_t nVarAlign = sizeof(变长数组元素类型);
    size_t nBufSize = sizeof(A) - nMaxAlign + (nVarAlign * N + nMaxAlign - 1) / nMaxAlign * nMaxAlign;1. 这个结构体中对齐要求最严格的类型是需要人工确定的,因此正确性很难保证。
    2. 如果改变最大对齐模数,计算方法又会不同。
    3. 如果这个数据要在两个分别编译的模块里使用,那么就很难保证其最大对齐模数设置相同,即很难保证读取到的是正确位置的数据。
      

  4.   

    不要用结构体,用数据流形式就行了。实在想用结构体模式,可以这样:class A
    {
    BYTE *m_pA;
    public:
    A(BYTE *pA) : m_pA(pA) {} int Len() {return *(int *)m_pA;}
    char Buf(size_t n = 0) {return *((char *)m_pA + sizeof(int) + n);}
    };int asdf(BYTE *pMem)
    {
    A aaa(pMem);
    int nLen = aaa.Len();
    char Buf0 = aaa.Buf();
    char Buf100 = aaa.Buf(100);
    };
      

  5.   

    就是像iostream那样,直接把所有数据依次用<<运算符输入进内存里,所有数据的长度的和即为总数据长度。
    使用的时候把内存首地址往上面那个类里一套,就可以直接用了。要转到下一个对象,就增加一个成员函数:BYTE* Next() {return (char *)m_pA + sizeof(int) + Len();}