我的课程有效,但我的教授说我的代码不正确,但表示他会在秋季学期到底为什么......他在说什么? 也许是不合适的东西?即使你是不正确的我也会喜欢挑选你的大脑:)
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;
}
}
答案 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;
我将离开该部分来处理调整大小比以前更小的值,以便你弄明白。