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

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

Восстановить пароль Регистрация
 
Alberto_Timakov
1 / 1 / 0
Регистрация: 21.11.2011
Сообщений: 183
24.09.2012, 22:10     нехватка памяти, обработчки, set_new_handler(), оператор new #1
Здравствуйте! Есть код:

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 - просто статическая переменная). Т.е. получается, что этот делит не только из-под
моего шмата памяти высвобождает память, но и еще из-под чего-то??????? Как оно вообще происходит?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.09.2012, 22:10     нехватка памяти, обработчки, set_new_handler(), оператор new
Посмотрите здесь:

C++ Оператор -> и спецификатор класса памяти extern
C++ Оператор break как оператор go to next
C++ Оператор new. Чему равны эллемнты выделенной памяти по умолчанию?
Нехватка памяти C++
C++ Оператор new. Динамическое выделение памяти - В чем разница двух определений массивов
C++ Оператор new гарантирует алокацию непрерывного блока памяти? (выравнивания)
C++ Проверка выделения памяти указателей через оператор new
Нехватка памяти при создании динамических объектов C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 16:04. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru