невидимые мемори лики
От: Аноним  
Дата: 10.09.09 13:36
Оценка:
Добрый день господа, вот есть код, который корректно чистит за собой всю выделенную память, но после его работы
в таск менеджере видно, что прога отъела 14мб памяти. Не втыкаю уже второй день, почему так происходит, объясните плиз?


#include "stdafx.h"

#include <iostream>
#include <windows.h>
#include <vector>

template<typename TYPE, unsigned int SIZE> class swi_array
{
public:
  swi_array()
  {
    memset(m_list, 0, sizeof(m_list));
  }

  ~swi_array()
  {
    for (unsigned int i = 0; i < SIZE; ++i)
      if (m_list[i])
        delete m_list[i];
  }

  inline TYPE* set(unsigned int index)
  {
    if (!m_list[index])
      m_list[index] = new TYPE();

    return m_list[index];
  }

  inline TYPE* get(unsigned int index)
  {
    return m_list[index];
  }

  inline void del(unsigned int index)
  {
    if (m_list[index])
    {
      delete m_list[index];
      m_list[index] = 0;
    }
  }

private:
  TYPE* m_list[SIZE];
};

enum index_array_size 
{
  IA0_SIZE = 256,
  IA_SIZE = 65536,
  MEM_SIZE = 4096
};

struct index_array { 
  unsigned char* array[IA_SIZE];
};

typedef swi_array<index_array, IA0_SIZE> array_0;

void add_block(std::vector<unsigned char*>& data)
{
  static unsigned int m_size = 0;

  unsigned char* buf = 0;
  m_size += 15;
  if (m_size > MEM_SIZE)
  {
    m_size = 0;
    data.push_back(new unsigned char[MEM_SIZE]);
    memset(data[data.size() - 1], 8, MEM_SIZE);
    buf = data[data.size() - 1];
  }
}

int main(int argc, char* argv[])
{
  {
    std::vector<unsigned char*> data;
    data.push_back(new unsigned char[MEM_SIZE]);

    array_0* arr = 0;

    arr = new array_0();

    for (unsigned long long i = 0; i < 10000000; ++i)
    {
      unsigned int idx_a0 = static_cast<unsigned int>((i >> 16) & 0x00000000000000FF);
      unsigned int idx_ia = static_cast<unsigned int>(i & 0x000000000000FFFF);

      add_block(data);

      index_array* ia = arr->set(idx_a0);
      ia->array[idx_ia] = 0;
    }

    delete arr;

    for (unsigned int i = 0; i < data.size(); ++i)
      delete data[i];
  }

  std::cout << "end" << std::endl;

  while (true)
    Sleep(10);

  return 0;
}
Re: невидимые мемори лики
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 10.09.09 13:51
Оценка:
А почему ты решил что есть мемори лики? CRT вполне может не вернуть память системе, оставив ее себе, на будущее.
Re: невидимые мемори лики
От: Feonyf  
Дата: 10.09.09 16:58
Оценка:
Здравствуйте, Аноним, Вы писали:


А>Добрый день господа, вот есть код, который корректно чистит за собой всю выделенную память, но после его работы

А>в таск менеджере видно, что прога отъела 14мб памяти.

Я понимаю что память выросла и остановилась? Если да то можно весь код завернуть в цикл и запустить. Если память будет расти значит есть лики.
Моя строка построения буста:
.\bjam link=static threading=multi runtime-link=static -j %NUMBER_OF_PROCESSORS% --with-filesystem --with-thread --with-date_time address-model=64
Re: невидимые мемори лики
От: RonWilson Россия  
Дата: 10.09.09 17:52
Оценка:
Здравствуйте, Аноним, Вы писали:


А>Добрый день господа, вот есть код, который корректно чистит за собой всю выделенную память, но после его работы

А>в таск менеджере видно, что прога отъела 14мб памяти. Не втыкаю уже второй день, почему так происходит, объясните плиз?

судя по тому, что вижу после прогона ликов нет. если есть сомнения, прогоните через boundscheker какой-нить
Re: невидимые мемори лики
От: uzhas Ниоткуда  
Дата: 11.09.09 19:00
Оценка: +1
возможно, это не имеет отношение к утечкам, но для new[] нет пары delete[]
для винды это может быть неважно, но по стандарту это вроде UB

data.push_back(new unsigned char[MEM_SIZE]);


for (unsigned int i = 0; i < data.size(); ++i)
      delete data[i];
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.