带指针的可调整大小的数组

时间:2012-06-13 03:36:49

标签: c++ arrays visual-studio-2010 debugging pointers

我的课程有效,但我的教授说我的代码不正确,但表示他会在秋季学期到底为什么......他在说什么?  也许是不合适的东西?即使你是不正确的我也会喜欢挑选你的大脑:)

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;
    }
}

2 个答案:

答案 0 :(得分:8)

大概在这一行之前

m_paintValues = new int [m_intArraySize];

m_paintValues指向另一个数组。该数组现在已经泄露 - 你没有指向它的指针,因此它永远不会被释放。因此,永远不能重复使用该内存。编写一个可以完成大量工作的程序,并且在运行很长时间之前它会耗尽内存。

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

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

但是还有更多问题。首先,除非您知道delete[]明确指向数组,否则永远不能使用m_paintValues;你可以确保在构造函数中。更令人不安的是,当您设置新尺寸时,之前在m_paintValues中的所有数据都将被丢弃 - 您是否要将旧值复制到新数组中?这样做意味着在首次分配时使用临时变量来保存新数组,复制数据,然后将新数组分配给成员变量。

答案 1 :(得分:2)

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

所以而不是

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

DO

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;

我将离开该部分来处理调整大小比以前更小的值,以便你弄明白。