Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;正在检查参数是否为动态数组。有必要吗?_C++ - Fatal编程技术网

C++ C++;正在检查参数是否为动态数组。有必要吗?

C++ C++;正在检查参数是否为动态数组。有必要吗?,c++,C++,尝试删除函数Example1中的char*ArrayA时出现问题,因为ArrayA不是动态数组。只有当它等于零/空时,它才是动态数组。因此,为了解决这个问题,我创建了一个类似的函数-示例2。唯一的区别是Example2有一个布尔值,它检查char*ArrayB是否是动态数组 我知道我所做的不是不正确就是“无所谓”。所以请帮帮我。我将从错误中吸取教训 你会怎么做 void Example1( char* ArrayA, unsigned int Length ) { if( ArrayA

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

我知道我所做的不是不正确就是“无所谓”。所以请帮帮我。我将从错误中吸取教训

你会怎么做

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 );
};
我知道我所做的不是不正确就是“无所谓”。所以请帮帮我


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

也许您可以使用这个:

void Example3( char* ArrayC, unsigned int Length );
void示例2(char*ArrayB,无符号整数长度)
{
std::vector内部数组;
if(ArrayB!=0)
{
分配(ArrayB,ArrayB+Length);
}
其他的
{
internalArray.resize(长度,0x2);
}

//用internalArray做任何事情!!!你的
示例1
绝对不好,因为它试图释放一个没有动态分配的数组-这永远都不对。正如其他地方所解释的,如果你跨DLL边界调用,你也可能有不同的分配器,所以如果内存没有分配到要删除的地方,事情就会发生错。让分配它的人删除它。最好使用现有的标准功能,如
std::vector


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

你有理由不使用我们吗e
std::vector
?@Zeta在编写dll时可以使用它吗?我不可以删除dll中的“外部”数据,因为不同的内存管理器这是唯一的方法吗?如果我正在编写dll,我应该使用std::吗?@user2117427没有“唯一的方法”但是,你会试图通过这样的方式解决问题,而标准的一个标准的测试方法是STD::向量存在。而且是的,它可以被使用到任何你想去的地方。@ SirDarius谢谢。会这样做。@ USE2117427如果你使用C++,你就不必处理动态分配和内存管理Y了。我们自己。如果你发现自己这样做了,那么你几乎肯定是错了。值得退一步仔细看看标准库提供了什么。@SirDarius也许在dll的接口中使用std::vector不是一个好主意?如果主应用程序和dll使用不同的STL实现,会是什么?为什么:internalAarray.resize(Length,0x2);“为什么这样:internalArray.resize(Length,0x2);”-根据您的
::memset(ArrayB,0x02,sizeof(char)*Length);
顺便说一句,我认为将
常量添加到
char*ArrayB
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
};