我正在尝试缩小*bool
的数组,但我不确定它是否被正确删除。
这是我的源代码......
bool *oldStore;
void shrinkArray(int i)
{
int k;
bool *newStore;
for(k=0; k<i; k++)
{
newStore[k] = oldStore[k];
}
for(; k<originalSize; k++)
{
delete[] oldStore[k];
}
delete[] oldStore;
oldStore = newStore;
}
例如,如果我想将数组缩小到5
并且数组的原始大小为15
,那么它将保留前五个并删除最后十个,但我不是确定我的记忆是否正确管理。
答案 0 :(得分:1)
最简单的代码是: -
void shrinkArray(int i)
{
int k;
bool *newStore = new bool[i];
for(k=0; k<i; k++)
{
newStore[k] = oldStore[k];
}
delete [] oldStore; //assuming oldstore was allocated using new []..
oldStore = newStore;
}
答案 1 :(得分:1)
在进入编码细节之前考虑一下方法设计。我假设你有一个ínt数组,你在代码中的某个地方新建了。
想想谁“拥有”这个阵列?在某个地方创建int数组并在其他地方简单地删除[]可能不是一个好主意。请查看以下链接:What is a smart pointer and when should I use one?
想想你的newStore数组会发生什么。是应该替换oldStore还是要两个数组并行存在?如果你只是将newStore放在堆上谁/何时以及在何处再次删除[]它。
答案 2 :(得分:0)
你的代码错了。您声明了指针newStore
,但既没有初始化它也没有分配将由此指针指向的内存
bool *newStore;
所以下一个循环有不确定的行为。
for(k=0; k<i; k++)
{
newStore[k] = oldStore[k];
}
此外,如果指针oldStore
指向的数组的每个元素的类型bool *
依次是指针,则oldStore
本身应具有类型bool **
如果是这样,那么正确的函数可能看起来像
void shrinkArray( int n )
{
if ( n < originalSize )
{
bool **newStore = new bool * [n];
int i = 0;
for ( ; i < n; i++ ) newStore[i] = oldStore[i];
for ( ; i < originalSize; i++ ) delete oldStore[i];
delete [] oldStore;
oldStore = newStore;
originalSize = n;
}
}
考虑到oldStore
也应该有bool **
类型。
否则,如果原始数组的每个元素都具有类型bool
,则代码将类似于
void shrinkArray( int n )
{
if ( n < originalSize )
{
bool *newStore = new bool [n];
int i = 0;
for ( ; i < n; i++ ) newStore[i] = oldStore[i];
// Or
// std::copy( oldStore, oldStore + n, newStore );
delete [] oldStore;
oldStore = newStore;
originalSize = n;
}
}
考虑到使用标准容器std::vector<bool *>
或std::vector<bool>
会更好更简单,具体取决于容器元素的类型。