Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Kartopet
31 / 31 / 15
Регистрация: 08.06.2015
Сообщений: 107
#1

Освобождение памяти в списках - C++

16.06.2015, 11:32. Просмотров 332. Ответов 11
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
#pragma once
class Node
{
public:
 
    int value;
    Node * next;
    Node(int data);
    ~Node();
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "stdafx.h"
#include "Node.h"
 
 
Node::Node(int data)
{
    this->value = data;
    this->next = nullptr;
}
 
 
Node::~Node()
{
    
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#pragma once
#include "Node.h"
class StackLinkedList
{
 
private:
    Node * head;
public:
    
    void push(int data);
    int pop();
    int peek();
    void print();
    StackLinkedList();
    ~StackLinkedList();
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include "stdafx.h"
#include "StackLinkedList.h"
#include <iostream>
 
 
StackLinkedList::StackLinkedList()
{
    
}
 
void StackLinkedList::push(int data)
{
    if (head == nullptr)
    {
        head = new Node(data);
    }
    
    Node * currentNode = head;
 
    while (currentNode->next != nullptr)
    {
        currentNode = currentNode->next;
    }
 
    Node * temp = new Node(data);
 
    //temp->next = nullptr;
 
    currentNode->next = temp;
 
    temp = nullptr;
 
}
 
int StackLinkedList::pop()
{
 
    Node * currentNode = head;
 
    while (currentNode->next != nullptr)
    {
        currentNode = currentNode->next;
    }
 
    int tempPop = currentNode->value;
 
    delete currentNode;
 
    currentNode = nullptr;
 
    return tempPop;
}
 
int StackLinkedList::peek()
{
    Node * currentNode = head;
 
    while (currentNode->next != nullptr)
    {
        currentNode = currentNode->next;
    }
 
    return currentNode->value;
}
 
StackLinkedList::~StackLinkedList()
{
    
}
пытаюсь написать свой стек на односвязном списке. push, peek работают нормально. pop как-то странно освобождает память для последнего Node, я эту память могу прочесть после освобождения. возможна ли эта проблема из-за того что на этот кусок памяти ссылается не только currentNode(temp в push например).
вот значение последнего Node списка в отладчике: { value = -17891602; next = 0xfeeefeee}. в pop я освобождаю память вроде же как, и указатель на нее currentNode = nullptr, тогда предыдущий currentNode->next тоже должен быть равен nullptr?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.06.2015, 11:32
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Освобождение памяти в списках (C++):

резервирование памяти/освобождение памяти для трехмерного массива - C++
Необходимо создать трехмерный массив (A), в котором элементы вдоль направления Z выли бы выровнены по 16 байт. Есть две проблемы: ...

освобождение памяти - C++
Помогите найти ошибку, программа вилиться когда освобождаю память! Здесь выделения памяти double **CreateArray() { double...

Освобождение памяти в C++ - C++
Добрый день! В моей программе в функции выделяется память (new char) под символьный массив, который является элементом структуры. Это...

Освобождение памяти - C++
Есть многопоточное приложение. Создается глобальная структура: Пример из msdn. typedef struct _MyData { int val1; ...

Освобождение памяти - C++
Есть класс, в котором я выделяю память с помощью new. В деструкторе класса я с помощью delete освобождаю память, но у меня вылетает ошибка...

Освобождение памяти - C++
Добрый день. Пишу в рубрику &quot;Вопросы начинающих по С/С++&quot; посему вопрос глупый :) И все же, есть такой код //offset - массив...

11
Черный мечник
48 / 49 / 17
Регистрация: 29.12.2012
Сообщений: 436
16.06.2015, 11:41 #2
Реализация классов-контейнеров stack и list
Эм правдо пара нубов чето там писали про ошибки(внятный ответ что именно я получитьнемогу) ,но работает более менее адеватно...
0
Kartopet
31 / 31 / 15
Регистрация: 08.06.2015
Сообщений: 107
16.06.2015, 11:42  [ТС] #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int StackLinkedList::pop()
{
 
    Node * currentNode = head;
 
    while (currentNode->next != nullptr)
    {
        currentNode = currentNode->next;
    }
 
    int tempPop = currentNode->value;
 
    delete currentNode;
 
    currentNode = nullptr;//вобще как я думаю проблема тут, тк предыдущий currentNode->next не становится равным nullptr
 
    return tempPop;
}
0
Черный мечник
48 / 49 / 17
Регистрация: 29.12.2012
Сообщений: 436
16.06.2015, 11:43 #4
nullptr;-я так понимаю чтоэто ноль а где она определенна?
0
Kartopet
31 / 31 / 15
Регистрация: 08.06.2015
Сообщений: 107
16.06.2015, 11:44  [ТС] #5
Черный мечник, я пишу сам, хочу узнать в чем тут проблема, потом посмотрю готовые решения =/

Добавлено через 55 секунд
Черный мечник, https://msdn.microsoft.com/ru-ru/library/jj651642.aspx
0
Черный мечник
48 / 49 / 17
Регистрация: 29.12.2012
Сообщений: 436
16.06.2015, 11:50 #6
Kartopet, может проше использовать 0
там библеотеку к тому подключили?
0
Kartopet
31 / 31 / 15
Регистрация: 08.06.2015
Сообщений: 107
16.06.2015, 11:52  [ТС] #7
Черный мечник, всё пробовал и NULL, и 0. видимо где-то еще ошибся
0
Черный мечник
48 / 49 / 17
Регистрация: 29.12.2012
Сообщений: 436
16.06.2015, 12:03 #8
C++
1
return tempPop;
для чего это в pop

Добавлено через 9 минут
ну если логически подумать то мы идем по цыклу стаем на последним элементи потом ты его треш этот обьект а теперь указателю удаленного обьекту присваиваеш 0, но указатель прошлого обьекта указывает на адрес этого старого удаленного обьекта всеравно тоесть на мусор(тупо как то обьяснил незнаю как подругому)...
тебе надо последнему еллементу который после удаления стал указать что он указывает на ноль...
0
Kartopet
31 / 31 / 15
Регистрация: 08.06.2015
Сообщений: 107
16.06.2015, 12:05  [ТС] #9
Черный мечник, вернуть значение элемента, который достаем

Добавлено через 1 минуту
Цитата Сообщение от Черный мечник Посмотреть сообщение
тебе надо последнему еллементу который после удаления стал указать что он указывает на ноль...
Цитата Сообщение от Kartopet Посмотреть сообщение
C++
1
2
delete currentNode;
currentNode = nullptr;
это не то? тогда ведь предыдущий currentNode->next должен быть = 0(или nullptr)
0
Черный мечник
48 / 49 / 17
Регистрация: 29.12.2012
Сообщений: 436
16.06.2015, 12:14 #10
у тебя есть два обьекта A и B ,B указывает на A,теперь ты говориш что адрес обькта A равен нулю,но обьект B про это незнает и продолжает указывать на то место где был A ,тоесть на мусор...
такаяже ситуация утебя в конце списка ты удаляеш последний элемент а предпоследний про это незнает поэтому и указывает на то место где по его мнению находится обьект последний(а ты должен ему сказать что он должен указывать на ноль) поэтому падает программа ...

Добавлено через 1 минуту
тоесть у тебя все правильно но после удаления твой последний элемент указывает на мусор а должен на ноль
0
Kartopet
31 / 31 / 15
Регистрация: 08.06.2015
Сообщений: 107
16.06.2015, 12:32  [ТС] #11
Черный мечник, ок, а как поправить это? хранить еще и хвост и в нем ссылку предпоследний элемент?
0
Черный мечник
48 / 49 / 17
Регистрация: 29.12.2012
Сообщений: 436
16.06.2015, 13:02 #12
написать функцию длины списка...(только он должен посчитать и последний элемент), а можно эту переменую int tempPop =0; определить до цыкла и в нем увеличивать инкрементом до тех пор пока она будет меньше чем длина -1 это в условии цыкла а потом твоей переменый присвоить то значение для которого была создана...
и когда стоять мы будем на предпоследним элементи наверно еше обьект понадобится Node * чтобы указывал на последний,потом нулим сылку на последний элимент и теперь у нас хвоост указывает на ноль а с этим указателем на обьект что мы создали можем провести все действия которые ты делал там...

Добавлено через 44 секунды
я бы сделал как то так написал много=)а изменить мало надо
1
16.06.2015, 13:02
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.06.2015, 13:02
Привет! Вот еще темы с ответами:

Освобождение памяти - C++
#include&lt;iostream&gt; #include&lt;cstring&gt; using namespace std; struct stringy{ char * str; int ct; }; stringy &amp; set(stringy &amp;...

Освобождение памяти - C++
Маленький вопросик, как правильно освобождать память выделенную под vector&lt;...&gt;, деструктором ~vector() или методом clear() ?

Освобождение памяти - C++
Товарищи,недавно баловался в Microsoft VS,готовился к экзаменам,писал небольшие програмки с использованием динамических массивов.Память под...

Освобождение памяти - C++
Добрый день. Подскажите пожалуйста, почему возникает ошибка при уничтожение массива class MyClass { public: int *data; int...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru