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