0

我的程序有效,但我的教授说我的代码不正确,但表示他会在秋季学期找到原因……他在说什么?也许有什么不合适的?即使你不正确,我也会很感激你的大脑:)

void CResizableArray::SetSize( int intNewSize )
{
    int intIndex = 0;

    if( intNewSize < 0 ) intNewSize = 0;
    if( intNewSize > intMAXIMUM_ARRAY_SIZE )
    {
        intNewSize = intMAXIMUM_ARRAY_SIZE;
    }

    //////////////////////////////////////
    //     ---> HUGE BUG HERE <---      //
    //     Code works but is WRONG      //
    // WHY IS THIS HELP ME FIND THE BUG //
    //////////////////////////////////////

    m_intArraySize = intNewSize;
    m_paintValues = new int [m_intArraySize];

    // Initialize to zero
    for( intIndex = 0; intIndex < m_intArraySize; intIndex++ )
    {
        *( m_paintValues + intIndex ) = 0;
    }
}
4

2 回答 2

8

大概在这条线之前

m_paintValues = new int [m_intArraySize];

m_paintValues指向另一个数组。那个数组现在已经泄露了——你没有指向它的指针,所以它永远不能被释放。因此,该内存永远不能被重用。编写一个执行大量此操作的程序,它会在运行很长时间之前耗尽内存。

当你用完一块内存时,你需要释放它。在这里,正确的做法可能看起来像

delete[] m_paintValues;
m_paintValues = new int [m_intArraySize];

不过,还有更多问题。首先,delete[]除非你知道m_paintValues绝对指向一个数组,否则你永远不能使用;你可以确保在构造函数中。更麻烦的是,当你设置一个新的大小时,之前的任何数据m_paintValues都会被丢弃——你不想把旧的值复制到新的数组中吗?这样做意味着在第一次分配时使用临时变量来保存新数组,复制数据,然后将新数组分配给成员变量。

于 2012-06-13T03:39:31.653 回答
2

他可能的意思是,由于它是调整大小,您应该保留数组的旧内容并将它们转移到新数组,在您的代码段中,您只需丢弃旧内容,创建一个新的空数组。

所以而不是

m_paintValues = new int [m_intArraySize];
// Initialize to zero
for( intIndex = 0; intIndex < m_intArraySize; intIndex++ )
{
    *( m_paintValues + intIndex ) = 0;
}

int* newBiggerArray = new int[m_intArraySize];
for (intIndex = 0; intIndex < m_intArraySize; ++intSize)
{
   if ( intIndex < oldMaxSize )
   {
     newBiggerArray[intIndex] = m_paintValues[intIndex];
   }
   else
   {
     newBiggerArray[intIndex] = 0;
   }
}
delete [] m_paintValues;
m_paintValues = newBiggerArray;

我将留下部分来处理调整到比以前更小的值,以便您弄清楚。

于 2012-06-13T03:41:58.307 回答