0
void Example1( char* ArrayA, unsigned int Length )
{
    if( ArrayA == 0 )
    {
        ArrayA = new char[ Length + 1 ];
        // Fill it with 2 - whatever
        ::memset( ArrayA, 0x02, sizeof( char ) * Length );
        ArrayA[ Length ] = '0\n';
    }
    // Do whatever with ArrayA

    // Clean-Up
    // Error occurs
    delete [ ] ArrayA;
};

void Example2( char* ArrayB, unsigned int Length )
{
    bool IsDynamic = false;
    if( ArrayB == 0 )
    {
        ArrayB = new char[ Length + 1 ];
        // Fill it with 2 - whatever
        ::memset( ArrayB, 0x02, sizeof( char ) * Length );
        ArrayB[ Length ] = '0\n';
        IsDynamic = true;
    }
    // Do whatever with ArrayA

    // Clean-Up
    // Have to check...
    if( IsDynamic )
        delete [ ] ArrayB;
};


int main( void )
{
    Example1( "\x01\x02\0x03", 3 ); // Example1 WILL NOT* declare ArrayA as a dynamic array - ERROR (caused by deleting non dynamic array)

    Example2( 0, 3 ); // ArrayB will be a dynamic array - OK
    Example1( 0, 3 ); // OK

    Example2( "\x04\x05\0x06", 3 ); // ArrayB isn't a dynamic array - OK

    return ( 0 );
};

尝试删除函数 Example1 中的 char* ArrayA 时会出现问题,因为 ArrayA 不是动态数组。如果它等于零/空,它只会是一个动态数组。所以,为了解决这个问题,我创建了一个类似的函数 - Example2。唯一的区别是 Example2 有一个布尔值,用于检查 char* ArrayB 是否为动态数组。

我知道我在做什么是不正确的或“noobish”。所以请帮助我。我会从我的错误中吸取教训。

你会怎么做?

void Example3( char* ArrayC, unsigned int Length );
4

3 回答 3

1

也许你可以使用这个:

void Example2( char* ArrayB, unsigned int Length )
{
    std::vector< char > internalArray;
    if ( ArrayB != 0 )
    {
        internalArray.assign( ArrayB, ArrayB + Length );
    }
    else
    {
        internalArray.resize( Length, 0x2 );
    }
    // Do whatever with internalArray !!! <-------

    // No (!!!) clenup need
};
于 2013-02-28T09:48:31.677 回答
0

我知道我在做什么是不正确的或“noobish”。所以请帮助我。

我的总体建议是从使用 C 数组转为使用std::vector

于 2013-02-28T09:42:22.497 回答
0

example1绝对是坏的,因为它试图释放一个不是动态分配的数组——这是永远不对的。正如其他地方所解释的,如果您跨 DLL 边界调用,您可能还有不同的分配器,所以如果内存没有分配到它被删除的地方,事情就会出错。让分配它的人删除它。最好使用已经存在的标准功能,例如std::vector

example2只使用delete在函数中创建的东西,这很好。它不会尝试delete在同一个分配器中分配它不知道的东西。然而, astd::vector肯定会更容易处理。

于 2013-02-28T09:54:04.270 回答