Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Жрет память.

335
03 мая 2006 года
enola
379 / / 25.01.2005
Есть структуры:
Код:
typedef struct
{
    char Field1[60];
    char Field2[8];
    char Field3[8];
} Struct1;

typedef struct
{
    char Field1[256];
    char Field2[256];
} Struct2;


есть контейнеры:
 
Код:
typedef map<AnsiString, Struct1> Map1;

typedef multimap<int, Struct2> Map2;


передаю эти два контейнера в поток через конструктор по ссылке:
 
Код:
void __fastcall TDataThread::SetData(Map1 &Data1,
    Map2 &Data2)
{
    MapData1 = Data1;
    MapData2 = Data2;
}


объявлены контейнеры в классе потока:
 
Код:
Map1 MapData1;
    Map2 MapData2;


и вот когда поток получает контейнеры прога в памяти занимает 30 метров!!!
Почему так много?
335
03 мая 2006 года
enola
379 / / 25.01.2005
еще уточнение записей в первом контейнере 50000, во втором 15.
Еще одна проблема возникла: по завершении потока я его уничтожаю (delete) а память не освобождается, почему?
585
03 мая 2006 года
honeybeer
297 / / 06.09.2004
Цитата:
Originally posted by enola
еще уточнение записей в первом контейнере 50000, во втором 15.
Еще одна проблема возникла: по завершении потока я его уничтожаю (delete) а память не освобождается, почему?


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

335
03 мая 2006 года
enola
379 / / 25.01.2005
Цитата:
Originally posted by honeybeer
Я вот одного не пойму... какой смысл передавать что-либо по ссылке, если потом опять же производить копирование обьектов? Передавайте по значению


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

1
03 мая 2006 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by enola
Есть структуры:
Код:
typedef struct
{
    char Field1[60];
    char Field2[8];
    char Field3[8];
} Struct1;

typedef struct
{
    char Field1[256];
    char Field2[256];
} Struct2;


есть контейнеры:
 
Код:
typedef map<AnsiString, Struct1> Map1;

typedef multimap<int, Struct2> Map2;


передаю эти два контейнера в поток через конструктор по ссылке:
 
Код:
void __fastcall TDataThread::SetData(Map1 &Data1,
    Map2 &Data2)
{
    MapData1 = Data1;
    MapData2 = Data2;
}


объявлены контейнеры в классе потока:
 
Код:
Map1 MapData1;
    Map2 MapData2;


и вот когда поток получает контейнеры прога в памяти занимает 30 метров!!!
Почему так много?


Для начала - как правило не стоит помещать в контейнер объект - в большинстве задач достаточно указатель. Во вторых - перед удалением контейнера - очищай его.
Ну а все остальное - по приведенному коду сказать сейчас сложно - начни с анализа логики программы. Ну и надо учитывать - контейнеры не самая дешевая по памяти вещь.
З.Ы. А что у тебя реализует связка мап+мультимап? Просто, таким они используются достаточно редко - и как правило это говорит о ошибке проектирования.

395
03 мая 2006 года
RelB
367 / / 09.11.2002
Цитата:
Originally posted by honeybeer
Я вот одного не пойму... какой смысл передавать что-либо по ссылке, если потом опять же производить копирование обьектов? Передавайте по значению

Смысл в том, что при передаче обекта передается копия, тем самым сжирая память и время!

585
03 мая 2006 года
honeybeer
297 / / 06.09.2004
Цитата:
Originally posted by RelB
Смысл в том, что при передаче обекта передается копия, тем самым сжирая память и время!


Угу, особенно в этом случае, когда для объектов переданных по ссылке создается ровно два новых объекта того же типа и вызывается operator=

335
04 мая 2006 года
enola
379 / / 25.01.2005
Цитата:
Originally posted by kot_
Для начала - как правило не стоит помещать в контейнер объект - в большинстве задач достаточно указатель. Во вторых - перед удалением контейнера - очищай его.


я его очищаю методом clear(); а возможности удалить как я понял нет. Он удаляется при удалении класса?!

Цитата:

З.Ы. А что у тебя реализует связка мап+мультимап? Просто, таким они используются достаточно редко - и как правило это говорит о ошибке проектирования.


 
Код:
typedef struct
    {
        char Field1[60];
        char Field2[8];
        char Field3[8];
    } Struct1;

    typedef map<AnsiString, Struct1> Map1;

Да я в STL новичок, вообще используя контейнеры (ассоциатьивный массив) преследовал несколько целей, может есть более "дешевая" замена?
Имеем следующий данные: ключевое поле (числовое, сделал AnsiString для удобства), Поле1-Поле3 данные привязанные к ключевому полю, тоже строковые.
Вот что мне нужно реализовать:
1. Поиск по ключевому полю
2. Отсутствие дубликатов
Эти данные в программу попадают из файла, потом происходит их обработка и выгрузка.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог