Форум программистов, компьютерный форум CyberForum.ru

нехватка памяти, обработчки, set_new_handler(), оператор new - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Как нарисовать восьмиугольник? http://www.cyberforum.ru/cpp-beginners/thread657450.html
не получается задать координаты 8-угольника( //--------------------------------------------------------------------------- #include <vcl.h> #include <stdlib.h> //------------- GLUT ------------------ #define GLUT_BUILDING_LIB #include "glut.h"
C++ Распределение памяти в реальном режиме процессора В общем, выбрал задание по курсовой по СПО "Утилита отображения распределения памяти" Разработать консольную утилиту, отображающую распределение памяти в реальном режиме процессора (Convential и Upper memory) в наглядной форме. Отображать адреса распределенных и свободных блоков памяти и владельца блока. собственно, хотел бы понять с вашей помощью насколько эта тема сложна (не имею... http://www.cyberforum.ru/cpp-beginners/thread657442.html
C++ Не могу разобраться с интерфейсом
Здравствуйте, у меня такой вопрос. Я как то видел в одном из видео уроков по С++ что в его Visual С++ используется(не знаю как правильно называется) авто продолжение набора команд, буквально ввел пару букв и уже появляется список из которого можно выбрать команду. Я кроме как "отобразить завершение слов (нажать Стрл + пробел)" ничего найти не могу, да и по моему это не удобно каждый рас нажимать...
Написать программу проверки знания даты основания Санкт-Петербурга. В случае неправильного ответа пользователя, программа должна выводить правильный о C++
Сделайте плиз задачку) 85. Написать программу проверки знания даты основания Санкт-Петербурга. В случае неправильного ответа пользователя, программа должна выводить правильный ответ. Ниже приведен рекомен дуемый вид экрана во время выполнения профаммы (данные, вве денные пользователем, выделены полужирным шрифтом). в каком году был основан Санкт-Петербург? Введите число и нажмите...
C++ Вычислить значение функции http://www.cyberforum.ru/cpp-beginners/thread657417.html
В универе дали задание написать программу, решающую функцию... новичок полный в С++, часть сделал.. теперь проблема переписать формулу на язык С++ кому не лень, и умеет это делать, напишите пожалуйста формулу http://s40.***********/i088/1209/5c/f5da7f10fd13.jpg помогите пожалуйста.. буду очень благодарен.. P.S. Политех (1курс) Добавлено через 21 час 1 минуту
C++ Как работает оператор char *? Как работает оператор char *! Можете описать его принцип работы! Спасибо заранее! подробнее

Показать сообщение отдельно
Alberto_Timakov
1 / 1 / 0
Регистрация: 21.11.2011
Сообщений: 183

нехватка памяти, обработчки, set_new_handler(), оператор new - C++

24.09.2012, 22:10. Просмотров 524. Ответов 0
Метки (Все метки)

Здравствуйте! Есть код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include "stdafx.h"
#include <new>
#include <exception>
#include <iostream>
 
using namespace std;
 
static int * p = new int [200000000];
 
static int count = 0;
 
void f(){cout << "f()" << endl; delete [] p;}
 
typedef void (*new_handler_)();
 
class X
{
public: static new_handler_ set_new_handler(new_handler_ p);
        static void * operator new(size_t size);
private: 
    int vec[300000000];
    static new_handler_ current_handler; 
};
 
new_handler X::current_handler;
 
new_handler X::set_new_handler(new_handler p)
{
    cout << "X::set_new_handler(new_handler p)" << endl;
    new_handler old_handler = current_handler;
    current_handler = p;
    return old_handler;
}
 
void * X::operator new(size_t size)
{
    cout << "X::operator new(size_t size)" << endl;
    new_handler global_handler = std::set_new_handler(current_handler);
    void * memory;
    try
    {
        cout << "X::operator new(size_t size):try" << endl;
        memory = ::operator new(size);
    }
    catch(std::bad_alloc & ba)
    {
        cout << "X::operator new(size_t size):try:catch" << endl;
        std::set_new_handler(global_handler);
        cout << ba.what() << endl;
        throw;
    }
    cout << "X::operator new(size_t size):try:catch:" << endl;
    std::set_new_handler(global_handler);
    return memory;
}
 
int main()
{
    X::set_new_handler(f);
    X * x = new X;
    X * y = new X;
    X * z = new X;
    system("Pause");
    return 0;
}

Вопрос: Прога падает при запросе памяти int[400000000]. Нормально держится при int[300000000].
для обработки нехватки памяти, я выделил изначально большой шмат памяти int[200000000]. Т.е. осталось у меня в запасе
int[100000000]. Объект класса X весит int[300000000]. Т.е. для того, чтобы под него выделилась память, необходимо
в обработчике new высвободить память из-под шмата. Ок. Первый объект x создан, шмата памяти больше нет, но...под остальные
объект y и z так же все выделяется как и для объекта x, если не поставить в обработчике (для проверки) условие
if(!(count++))delete [] p;. (count - просто статическая переменная). Т.е. получается, что этот делит не только из-под
моего шмата памяти высвобождает память, но и еще из-под чего-то??????? Как оно вообще происходит?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru