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

Net*_*son 0 c++ arrays debugging pointers visual-studio-2010

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

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Ern*_*ill 8

大概在此之前

m_paintValues = new int [m_intArraySize];
Run Code Online (Sandbox Code Playgroud)

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

当你使用一块内存时,你需要释放它.在这里,正确的事情可能看起来像

delete[] m_paintValues;
m_paintValues = new int [m_intArraySize];
Run Code Online (Sandbox Code Playgroud)

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