2012-06-13 6 views
0

내 프로그램이 작동하지만 내 교수가 내 코드가 잘못되었다고 말하지만 그가 가을 학기에 왜 나타날지에 대해 이야기합니다 ... 그게 무슨 소리 죠? 아마도 뭔가 잘못되었습니다? 당신이 잘못된 경우에도 나는 아마도 포인터로 크기를 조정할 수있는 배열

m_paintValues = new int [m_intArraySize]; 

m_paintValues

다른 배열에 지적이 줄 앞에

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

'm_paintValues ​​[intIndex]'대신'* (m_paintValues ​​+ intIndex)'를 사용하는 특별한 이유가 있습니까? 배열 포인터 동등성을 탐색하는 것뿐 이었습니까? 더 나은 것은'new int [m_intArraySize]()'일 것이고, 이것은 당신을 위해 초기화 할 것이다. – Shoaib

+0

'std :: vector'를 사용할 때 버그를 소개 할 이유가 있습니까? –

+0

나는 그 방법에 익숙하지 않다. 아마도 나를 계몽 할 수 있을까? –

답변

8

:) 당신의 두뇌를 따기 감사하겠습니다. 그 배열은 지금은 유출되었습니다 - 당신은 그것에 대한 포인터가 없어, 그래서 결코 풀 수 없습니다. 따라서이 메모리는 결코 재사용 될 수 없습니다. 이 작업을 많이하는 프로그램을 작성하면 메모리가 부족하여 실행 시간이 오래 걸릴 수 있습니다.

메모리 블록을 통과 할 때 해제해야합니다. 여기에 할 일은 비슷할 것 같습니다.

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

더 많은 문제가 있습니다. 무엇보다도 m_paintValues가 배열을 확실히 가리키고 있지 않다면, delete[]을 결코 사용할 수 없습니다. 당신은 생성자에서이를 보장 할 수 있습니다. 더 큰 문제는 새 크기를 설정할 때 이전에 m_paintValues의 데이터가 삭제된다는 것입니다. 이전 값을 새 배열에 복사하지 않으시겠습니까? 이렇게하면 임시 변수를 사용하여 처음 할당 될 때 새 배열을 보유하고 데이터를 복사 한 다음 새 배열을 멤버 변수에 할당해야합니다.

+0

와우 그게 내 접두사 붙이는 방법 때문에 실제로 그 배열을 가리키며 말할 수있어. 사실 intValues라는 이름의 정수와 같은 의미의 배열과 p 포인터를 의미한다 포인터 배열 int Values ​​또는 paintValues ​​ –

+0

@NethMunson - 나는 당신이 어떤 유형의 변수인지를 알 필요가 있다는 것을 의미하지는 않았다. 나는 변수의 값이 실제로 호출 할 때 실제 배열에 대한 유효한 포인터라는 것을 알지 못한다면'delete []'를 호출 할 수 없다는 것을 의미했다. 포인터가 '0'이거나 그렇지 않으면 가비지 또는 이전에 해제 된 배열을 가리키면'delete []'를 호출하면 아마 프로그램이 중단됩니다. –

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; 

난 당신이 파악을 위해 이전보다 더 작은 값으로 크기 조정을 처리하는 부분을 떠나 않습니다.

+0

불행히도이 프로그램의 목적이 아닙니다. 내 프로그램은 정확히 무엇을 할 수 있도록 만들어졌으며, 지금은 포인터에 대해 배우기 때문에 간단하게 유지했습니다. –

관련 문제