2016-02-16 2 views
-2

Я работаю над использованием указателей для добавления объектов в очередь и сталкивался с странной поведенческой проблемой, которую я не могу понять.C++ Неизменяемый указатель, изменяющийся после вызова функции

Каждый объект, который добавляется в очередь, имеет указатель «next», который связывает их все вместе, и у меня есть указатель «start» и «end», чтобы отслеживать, где находятся каждый конец очереди.

Проблема заключается в том, что когда я передаю конечный указатель и объект (который хранится в pArray по его идентификатору processID), он также меняет указатель начала - хотя я не передаю его функции.

// snippet from my main.cpp 
RQCount = 0; 
if (RQCount == 0) 
    { 
     RQStart = &pArray[processID]; 
     RQStart -> next = &pArray[processID]; 
     endRQ = &pArray[processID]; 
     pArray[processID].setStatus("Ready"); 

     CPUHolder = RQStart; 
     CPU = RQStart -> CPUBurst; 

     RQStart ->pStatus = "Executing"; 
    } 
    else 
    { 
     *endRQ = FCFS(endRQ, &pArray[processID]); 
     pArray[processID].setStatus("Ready") 
    } 
RQCount++; 

FCSC Метод:

PCB FCFS (PCB *endRQ, PCB *obj) 
{ 
    endRQ -> next = obj; 
    endRQ = obj; 

    return *endRQ; 
}; 

Я сузили к функции, и что на самом деле пни меня, что я переместить эти две строки кода, чтобы мой главный, он работает и ведет себя просто хорошо. Это когда я добавляю функцию, которой нет. Я думаю, что это связано с тем, как я имею дело с указателями и разыменованием, но я мог бы использовать некоторую помощь, чтобы понять это. Благодаря!

EDIT:

Чтобы подчеркнуть, что я не возникли проблемы с переменными не изменяется в функции, так как кто-то что этот дубликат вопрос для. Проблема заключается в том, что после вызова функции она меняет RQStart (которая не передается функции).

Если я не использую функцию, RQStart останется неизменным, когда я использую эту функцию, RQStart изменяет на другой объект.

+1

Странная поведенческая проблема - это то, что я вижу много на переполнении стека. – SergeyA

+0

'return * endRQ;' возвращает копию 'endRQ', это, вероятно, не то, что вы хотите. –

+0

Вам необходимо опубликовать [** Минимальный законченный ** Подтверждаемый пример] (http://stackoverflow.com/help/mcve). На самом деле, в процессе разработки MCVE, я ожидаю, что вы сами найдете проблему. – user3386109

ответ

0

Если вы

RQStart = &pArray[processID]; 
    // ... 
    endRQ = &pArray[processID]; 

, а затем передать endRQ функции, которая будет такой же, как если бы вы прошли RQStart.

Поэтому, когда вы меняете endRQ->next, это также изменит RQStart->next.

Это одна из причин стандартные контейнеры имеют end() точку один мимо последний элемент, а не к последний элемент.

Смежные вопросы