Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как правильно очистить память? 
V
    Опции темы
0000
Дата 21.11.2007, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 11.7.2006
Где: Нижний Новгород

Репутация: нет
Всего: 5



Добрый вечер всем..с C++ у меня тяжко..объясните плз. один момент..
допустим есть класс X.. в нем храним массивчик из элементов того же типа X...
как правильно удалить??
вот код
X.h
Код

class X
{
private: 
    X* x;
    int c;
public:
    X();
    void  Add(const X& x1);
    X& operator = (const X& x1);
public:
    ~X();
};


X.cpp
Код

X::X()
{
    c = 0;
    x = new X[0];
}
X& X::operator =(const X& x1)
{
    c = x1.c;
    x = new X[c];
    for (int i = 0; i < c; i++)
    {
        x[i] = x1.x[i];
    }
    return *this;
}
void X::Add(const X& x1)
{
    x[c] = x1;
    c++;
}
X::~X()
{
    delete[] x;
}


main.cpp
Код

#include "stdafx.h"
#include "X.h"
#include <conio.h>

int _tmain(int argc, _TCHAR* argv[])
{
    X * x1 = new X();
    X * x2 = new X();

    x1->Add(*x2);
    delete x1;

    getch();
    return 0;
}


вот на удалении x1 и происходит ругань...плз, как удалить правильно такую структурку элементов?

спасибо
PM MAIL ICQ   Вверх
DjoNIK
Дата 21.11.2007, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 320
Регистрация: 28.9.2006
Где: Питер/Георгиевск

Репутация: 4
Всего: 5



Код

X::X()
{
    c = 0;
    x = new X[0];
}

Ты этим ни байта не резервируешь.


--------------------
- Плесни-ка мне холодного кипятку.
- Как кипяток может быть холодным?! Ты, верно, хочешь кипяченой воды?
- Какая ещё кипяченая вода? Не пудри мне мозги - налейхолодного кипятку.
(разговор петербуржца и москвича)
PM MAIL ICQ   Вверх
Greeen
Дата 21.11.2007, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 710
Регистрация: 13.8.2006
Где: Петербург

Репутация: 7
Всего: 18



В C++ запрещены массивы из 0 элементов


--------------------
Подпись больше не нужна
PM MAIL ICQ Skype   Вверх
DjoNIK
Дата 21.11.2007, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 320
Регистрация: 28.9.2006
Где: Питер/Георгиевск

Репутация: 4
Всего: 5



Код

void X::Add(const X& x1)
{
    x[c] = x1;
    c++;
}

По идее, каждый раз нужно резервировать место, когда идет добавление.

Это сообщение отредактировал(а) DjoNIK - 21.11.2007, 23:44


--------------------
- Плесни-ка мне холодного кипятку.
- Как кипяток может быть холодным?! Ты, верно, хочешь кипяченой воды?
- Какая ещё кипяченая вода? Не пудри мне мозги - налейхолодного кипятку.
(разговор петербуржца и москвича)
PM MAIL ICQ   Вверх
UnrealMan
Дата 22.11.2007, 01:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(Greeen @  21.11.2007,  23:41 Найти цитируемый пост)
В C++ запрещены массивы из 0 элементов

А это обязательно - уверенно говорить о том, в чём сам не разбираешься? Хоть бы "IMHO" добавил что ли.

Это сообщение отредактировал(а) UnrealMan - 22.11.2007, 01:55
PM MAIL   Вверх
0000
Дата 22.11.2007, 02:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 11.7.2006
Где: Нижний Новгород

Репутация: нет
Всего: 5



разве в C++ запрещены массивы из 0 элементов?? странно...я просто выделяю память через new, но не заполняю массив...
я больше по .NET, так вот это ассоциируется с созданием пустого листа (коллекции)...выделяешь память, не добавляя элементов....

в общем + 1 для DjoNIK, спасибо, именно это и надо было сделать!!! THX
PM MAIL ICQ   Вверх
UnrealMan
Дата 22.11.2007, 02:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(0000 @  22.11.2007,  02:25 Найти цитируемый пост)
разве в C++ запрещены массивы из 0 элементов??

Создать массив нулевой длины можно, но только затем, чтобы потом его удалить smile

Цитата(0000 @  22.11.2007,  02:25 Найти цитируемый пост)
выделяешь память, не добавляя элементов....

Это тебе std::vector надо использовать. Либо, если по каким-то причинам vector не подходит, самому выделять сырую память вызовом operator new с последующим размещением в ней объектов с помощью placement new.
PM MAIL   Вверх
Ln78
Дата 22.11.2007, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 274
Регистрация: 25.11.2006

Репутация: 13
Всего: 15



Цитата(0000 @  21.11.2007,  23:08 Найти цитируемый пост)
Код

X& X::operator =(const X& x1)
{
    c = x1.c;
    x = new X[c];
    for (int i = 0; i < c; i++)
    {
        x[i] = x1.x[i];
    }
    return *this;
}

В самом начале обычно следует проверять:
Код

if( this != &x1)

И перед тем, как вызывать new следует освободить уже занятую. Можно проверить, если размерности совпадают, то операции освобождения/выделения можно не делать, просто присвоить новые значения.
Цитата(0000 @  21.11.2007,  23:08 Найти цитируемый пост)
Код

class X
{
private: 
    X* x;

Я что-то не соображу, а зачем нужен такой класс? Для списков обычно достаточно одного-двух штук, а здесь целый массив, каждый из которых - тоже массив, и т.д. Можно привести пример, когда такая конструкция целесообразна? 


Это сообщение отредактировал(а) Ln78 - 22.11.2007, 08:57
PM MAIL   Вверх
0000
Дата 22.11.2007, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 11.7.2006
Где: Нижний Новгород

Репутация: нет
Всего: 5



Цитата(Ln78 @ 22.11.2007,  08:56)
Цитата(0000 @  21.11.2007,  23:08 Найти цитируемый пост)
Код

class X
{
private: 
    X* x;

Я что-то не соображу, а зачем нужен такой класс? Для списков обычно достаточно одного-двух штук, а здесь целый массив, каждый из которых - тоже массив, и т.д. Можно привести пример, когда такая конструкция целесообразна?


например для хранения вершин графа..в вершинах содержится инфа о смежных...
хотя тут действительно может лучше использовать vector
PM MAIL ICQ   Вверх
Greeen
Дата 22.11.2007, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 710
Регистрация: 13.8.2006
Где: Петербург

Репутация: 7
Всего: 18



Цитата(UnrealMan @  22.11.2007,  01:55 Найти цитируемый пост)
А это обязательно - уверенно говорить о том, в чём сам не разбираешься? Хоть бы "IMHO" добавил что ли.

У меня просто отложилась фраза Александреску "в C++ массивы нулевой длины запрещены", но там говорилось о массивах создающихся статически.  Вот чего то и ступил. Извините, UnrealMan, что задел вас (уж не знаю за что)...

Это сообщение отредактировал(а) Greeen - 22.11.2007, 13:10


--------------------
Подпись больше не нужна
PM MAIL ICQ Skype   Вверх
archimed7592
Дата 23.11.2007, 02:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Greeen @  22.11.2007,  12:56 Найти цитируемый пост)
У меня просто отложилась фраза Александреску "в C++ массивы нулевой длины запрещены"

 smile.
У меня тоже отложилась и я тоже как то раз "задел" этим UnrealMan'а smile.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0551 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.