Уничтожается ли выделение памяти с помощью malloc() внутри цикла при выходе из цикла?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Уничтожается ли выделение памяти с помощью malloc() внутри цикла при выходе из цикла?

Сообщение Anonymous »

Я новичок в C++. Я пытаюсь реализовать связанные списки и делаю это с помощью классов. Чтобы распределить узлы, я использую malloc() и выделяю память для каждого узла внутри цикла for (для второго-второго последнего узла).
Но когда я пытаюсь распечатать значения с помощью функции printList(), адреса памяти изменяются, и я больше не могу получить доступ к сохраненному ранее значению.
Код, о котором идет речь:

Код: Выделить всё

#include 
#include 

class Node{
private:
// Attributes
int value;
Node* nextNode;

public:

// Empty Constructor
Node(){
value = 0;
}

// Value-and-address Constructor
Node(int localValue, Node* localAddress){
value = localValue;
nextNode = localAddress;
}

// Value Setter
void setValue(int localValue){
value = localValue;
}

// Address Setter
void setAddress(Node* localAddress){
nextNode = localAddress;
}

// Value Getter
int getValue(){
return value;
}

// Next Node Address Getter
Node* getNextNode(){
return nextNode;
}
};

class linkedList{
private:
Node* firstNode;
Node* lastNode;
int sizeOfNode = sizeof(Node);
int lengthOfList = 0;
int iter;
Node* container = (Node*)malloc(sizeof(Node)); // Container for last node

public:

// Constructor
linkedList(int sizeOfList, int* localArray){

// Creation of first Node
firstNode = (Node*)malloc(sizeOfNode);
*firstNode = Node(localArray[0], container);

Node* previousNode = previousNode; // Current Node
lengthOfList ++;

for(int i = 1; i < sizeOfList-1; i++){
iter = i;
Node* currentNode = (Node*)malloc(sizeOfNode);
printf("\n Next Node Location: %p", currentNode);
(*previousNode).setAddress(currentNode);
printf("\n Current Node Location: %p", (*previousNode).getNextNode());
*currentNode = Node(localArray[i], container);
previousNode = currentNode;
lengthOfList ++;
}

// Creation of last Node
iter++;
lastNode = (Node*)malloc(sizeOfNode);
*lastNode = Node(localArray[iter], container);
lengthOfList ++;
}

void printList(){
// First Print
Node* currentNode = firstNode;
for(int i = 0; i < lengthOfList; i++){
printf("\n%d: %d\n", i, (*currentNode).getValue());
printf("Next Node Location: %p\n", (*currentNode).getNextNode());
currentNode = (*currentNode).getNextNode();
}
}
};

int main(){

int passedArray[] = {1, 2, 3, 4};
int sizeOfPassedArray = sizeof(passedArray)/sizeof(int);

linkedList list1 = linkedList(sizeOfPassedArray, passedArray);
list1.printList();
}
После запуска выводится следующее:

Код: Выделить всё

 Next Node Location: 00000261A1E6F940
Current Node Location: 00000261A1E6F940
Next Node Location: 00000261A1E6F700
Current Node Location: 00000261A1E6F700
0: 1
Next Node Location: 00000261A1E6F780

1: 0
Next Node Location: 0000000000000000
Я думаю, что адрес изменяется при выходе из цикла, потому что:
  • Вывод печатает другой адрес.

    Я по-прежнему могу нормально получить доступ к первому узлу.
В чем проблема и как ее решить?
Отладчик показывает ошибку сегментации в возвращаемое значение в функции getValue(), если это актуально, но это только со второй итерации цикла printList() и далее.

Подробнее здесь: https://stackoverflow.com/questions/788 ... pon-exitin
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Устранение неполадок с утечкой памяти в JInput: Windows не уничтожается должным образом
    Гость » » в форуме JAVA
    0 Ответы
    52 Просмотры
    Последнее сообщение Гость
  • VSCODE Test Explorer висит, несмотря на ошибки в выходе, и все собранные тесты (в выходе)
    Anonymous » » в форуме Python
    0 Ответы
    3 Просмотры
    Последнее сообщение Anonymous
  • Разница в использовании памяти между malloc и new в C++
    Anonymous » » в форуме C++
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous
  • Активность игрока уничтожается при паузе. Как воспроизвести?
    Anonymous » » в форуме Android
    0 Ответы
    20 Просмотры
    Последнее сообщение Anonymous
  • Активность игрока уничтожается при паузе. Как воспроизвести?
    Anonymous » » в форуме Android
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»