Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: Вопрос по поводу выделения памяти в C++  (Прочитано 828 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Swa

  • Автор темы
  • Новичок
  • *
  • Сообщений: 37
    • Просмотр профиля
Здравствуйте. У меня возник вопрос по поводу выделения/очистки памяти в программе. Сначала грешил на утечки, но сейчас сомневаюсь, может быть я не понимаю особенностей работы с памятью. Вот набросал небольшой примерчик:
#include <iostream>
#include <vector>

class A {
public:
A();
~A();
long int *n;
};

A::A(){
n = new long int [1000];
}

A::~A(){
delete [] n;
}

int main(int argc, char** argv){
std::vector <A*> v;
char c;

std::cout << "Start\n";
std::cin >> c;
std::cout << "Creating items\n";

for (int i=0; i< 1000; i++){
A* a = new A();
v.push_back(a);
}

std::cout << "Items created\n";
std::cin >> c;
std::cout << "Deleting\n";

for (int i = 0; i < v.size(); i++){
delete v[i];
v[i] = NULL;
}
v.clear();

std::cout << "Items deleted\n";
std::cin >> c;

return 0;
};

После запуска программы вызываю pmap:
mapped: 2836K    writeable/private: 168K
После заполнения вектора:
mapped: 6796K    writeable/private: 4128K
После очищения вектора:
mapped: 6796K    writeable/private: 4128K
Почему память не освободилась? Если вопрос нубский, прошу дать ссылку, что почитать на эту тему.

Оффлайн AlexH

  • Участник
  • *
  • Сообщений: 147
    • Просмотр профиля
Re: Вопрос по поводу выделения памяти в C++
« Ответ #1 : 29 Марта 2010, 22:21:21 »
Dозможно менеджер памяти не сразу ее освобождает. Типа думает , что вы объект A снова будете создавать, а у него уже все для этого готово (экономия времени на последующие выделения памяти).
Среда то какая?
arch x86_64

Оффлайн Swa

  • Автор темы
  • Новичок
  • *
  • Сообщений: 37
    • Просмотр профиля
Re: Вопрос по поводу выделения памяти в C++
« Ответ #2 : 29 Марта 2010, 22:43:04 »
В каком смысле "среда"?

Оффлайн axe

  • Старожил
  • *
  • Сообщений: 1203
    • Просмотр профиля
Re: Вопрос по поводу выделения памяти в C++
« Ответ #3 : 30 Марта 2010, 01:11:23 »
Ищи что такое куча (heap). Если вкратце, то runtime совсем не напрямую мапит выделяемую память в страницы виртуальной памяти, а действует через посредника - менеждер памяти.

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: Вопрос по поводу выделения памяти в C++
« Ответ #4 : 30 Марта 2010, 06:04:39 »
Дааа... ему предстоит еще много открытий чỳдных.

Оффлайн Swa

  • Автор темы
  • Новичок
  • *
  • Сообщений: 37
    • Просмотр профиля
Re: Вопрос по поводу выделения памяти в C++
« Ответ #5 : 30 Марта 2010, 20:39:54 »
Спасибо за ответы. Почитал статей, начинаю понимать.

Оффлайн Alexander8

  • Новичок
  • *
  • Сообщений: 22
    • Просмотр профиля
Re: Вопрос по поводу выделения памяти в C++
« Ответ #6 : 31 Марта 2010, 05:49:55 »
Вам правильно посоветовали что надо почитать.

Чтобы убедиться, что память действительно освободилась, можно переписать код так:

class A
{
public:
A();
~A();
long int *n;
};

A::A()
{
n = new long int [1000];
static int i = 0;
std::cout << "A::A() " << i << "\n";
i++;
}

A::~A()
{
delete [] n;
static int i = 0;
std::cout << "A::~A() " << i << "\n";
i++;
}

int main(int argc, char** argv)
{
std::vector <A*> v;

std::cout << "Start\n";
std::cout << "Creating items\n";

for (int i = 0; i < 10; i++)
{
A* a = new A();
v.push_back(a);
}

std::cout << "Items created\n";
std::cout << "Deleting\n";

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

std::cout << "Items deleted\n";
std::cin.get();

return 0;
}

 

Страница сгенерирована за 0.052 секунд. Запросов: 25.