forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   С++ и Блитц Параллели (http://forum.boolean.name/showthread.php?t=15240)

Vadimich 11.08.2011 09:40

Ответ: С++ и Блитц Параллели
 
вроде разобрался со связанным списком и его перебором.. но не могу быть до конца уверен, корректно ли я удаляю объект класса.. не остается ли мусора в памяти после этого. ведь object, являющийся указателем, сначала обнуляется.. но по другому delete применить не получилось

посмотрите, пожалуйста:
//--------------------------------
#include "stdafx.h"
#include <iostream>
using namespace std;

// Создаем новый класс
class Person
{
public:
int age,id,health;
Person* pNext;// указатель на следующий объект списка
};
Person* pRoot = 0; // указатель на основание списка

// создание основания класса
void PersonAddRoot()
{
Person* object = new Person;
object->pNext = pRoot;
pRoot = object;
return;
}

// создание нового объекта с добавлением в список
void PersonAddObject()
{
if (pRoot == 0) // если основание списка не было создано...
{
PersonAddRoot();// ... создаем основание
}
Person* object = new Person; // создаем новый объект
Person* pCurrent = pRoot; // создаем указатель на основание списка
int index=0; // инициализируем счетчик ID
while(pCurrent->pNext != 0)// ищем конец списка
{
index++;
pCurrent = pCurrent->pNext;
}
pCurrent->pNext = object; //устанавливаем указатель предыдущего объекта на новый объект
object->pNext = 0;
object->id = index;
object->health = 10;
object->age = index*3;
return;
}

void PersonShowList()
{
Person* pCurrent = pRoot; // создаем указатель на основание списка
while(pCurrent->pNext != 0)
{
pCurrent = pCurrent->pNext;
cout << "id: " <<pCurrent->id << " age: " << pCurrent->age << " health: " << pCurrent->health << endl;
}
return;
}

void PersonDeleteObject(Person* object)
{

Person* pCurrent = pRoot;
while(pCurrent->pNext != object)
{
pCurrent = pCurrent->pNext;
}
pCurrent->pNext = object->pNext;
object->pNext = 0;
object = 0;
delete(object);

return;
}

void PersonUpdate() // обновляем объекты типа и проверяем, какой удалить
{
Person* pCurrent = pRoot;
while(pCurrent->pNext !=0)
{
pCurrent = pCurrent->pNext;

if (pCurrent->id ==2)
{
pCurrent->age = 666;
PersonDeleteObject(pCurrent);
}

}

return;
}

int main()
{

for(int i=0;i<6;i++)
{
PersonAddObject(); // создаем объекты
}

PersonUpdate(); перебираем и удаляем через условие

PersonShowList(); отображение

return 0;
}

.Squid 11.08.2011 13:08

Ответ: С++ и Блитц Параллели
 
Конечно же, удаление неверное.
Вообще, зачем городить свой велосипед, если есть STL? Единственная причина не использовать STL - это если ты знаешь, что напишешь более быструю реализацию конкретно для решения своей узкой задачи.

Vadimich 11.08.2011 13:28

Ответ: С++ и Блитц Параллели
 
причина городить свои велосипеды - это понимать, как работают те или другие вещи...
хорошая практика по работе с указателями.
если всё таки допустить, что вышеописанная корявость имеет право на существование, то как бы удалил выбранный объект ты? если не трудно, опиши подробнее, пожалуйста... цель ведь научиться :)

.Squid 11.08.2011 14:10

Ответ: С++ и Блитц Параллели
 
Код:

object = 0;
 delete(object);

object = 0; убрать. Потому что в теле оператора delete стоит проверка на нулевой аргумент, который приводит к простому выходу из тела оператора. Поэтому кажется, что все работает.

Код:

if (pCurrent->id ==2)
 {
 pCurrent->age = 666;
 PersonDeleteObject(pCurrent);
 }

заменяешь на
Код:

if (pCurrent->id ==2)
{
        pCurrent->age = 666;
        Person* toDestroy = pCurrent;
        pCurrent = pCurrent->pNext;
        PersonDeleteObject(toDestroy);
}

Почему именно так - разбирайся сам с дебаггером, коли решил глубоко изучать.

ЗЫ. return писать не надо, если функция возвращает void.
ЗЗЫ. Ты что, действительно, пишешь с таким форматированием (точнее, без него)?!

Vadimich 11.08.2011 14:12

Ответ: С++ и Блитц Параллели
 
спасибо .Squid

Vadimich 11.08.2011 14:21

Ответ: С++ и Блитц Параллели
 
ЗЗЫ: да не.. просто так вставилось )


Часовой пояс GMT +4, время: 11:13.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot