Помогите с оператором New

Тема в разделе "WASM.BEGINNERS", создана пользователем ajak, 31 июл 2011.

  1. ajak

    ajak New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2007
    Сообщения:
    463
    В общем есть код. В коде есть оператор new - выделяет соотв количество байт. В конструкторе он работает в деструкторе тоже, хотя там разрушать надо. А вот в члене класса. вызываем исключение, обращения по 0-му адресу , я окончательно запутался

    Вот картинка

    [​IMG]
     
  2. ajak

    ajak New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2007
    Сообщения:
    463
    Затык на 401060 кто что скажет?
     
  3. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    По этому куску ничего сказать не возможно. А вообще "this" подозрительно мал.
     
  4. Ezrah

    Ezrah Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    411
    судя по всему, он равен нулю.
     
  5. ajak

    ajak New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2007
    Сообщения:
    463
    push esi это вход в член функцию дальше идет код неужели она не создается
     
  6. Ezrah

    Ezrah Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    411
    Исходник сверхсекретен, или что? Вам вроде дали ясно понять в #3, что с таким количеством информации Вы ответа не получите.
     
  7. intel_x128

    intel_x128 New Member

    Публикаций:
    0
    Регистрация:
    17 май 2009
    Сообщения:
    345
    Хип переполнен. Юзайте VirtualAlloc
     
  8. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    intel_x128
    Не путайте хип и стек, первый увеличивается в случае нехватки памяти. VirtualAlloc использовать абсолютно не нужно.
     
  9. GRRRLPower

    GRRRLPower New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2010
    Сообщения:
    46
    Немного не в тему, но либо
    Код (Text):
    1. memory = new (nothrow) byte[65536];
    2. if(!memory)
    3. ...
    либо
    Код (Text):
    1. try
    2. {
    3.   memory = new byte[65536];
    4. }
    5. catch(const std::bad_alloc&)
    6. {
    7. //...
    8. }
    надо писать.
     
  10. intel_x128

    intel_x128 New Member

    Публикаций:
    0
    Регистрация:
    17 май 2009
    Сообщения:
    345
    Booster
    Хип будет расширяться ровно до того момента, пока не закончатся резервные страницы.

    //______________________________________
    PCHAR p;
    do
    {
    p = new char[0x100];
    } while (p!=0);
    MessageBoxA(0, "Хип переполнен", "Ошибка", MB_OK);
    //______________________________________
     
  11. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    intel_x128
    Тоже самое можно написать и для VirtualAlloc, т.к. 2Гб юзермодных адресов - не резиновые ;)

    PS: ТС видимо сообразил (с подачи Ezrah), что "дал Маху", вызвав метод неинициализированного объекта this=ecx=null - и ушел в подполье или монастырЪ, оставив тему на растерзание любителям плясок с бубном ;)
     
  12. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    intel_x128
    Какие резервные страницы? Куча может расти до предела виртуальной памяти. В этом смысле VirtualAlloc и куча абсолютно равнозначны. Только куча более удобна.
     
  13. intel_x128

    intel_x128 New Member

    Публикаций:
    0
    Регистрация:
    17 май 2009
    Сообщения:
    345
    Тогда объясните для чего в РЕ-хидере указывается HeapAllocSize и HeapReservedSize ?
     
  14. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Это поля для системной кучи, как на неё влияют эти поля точно не знаю. У Си и С++ свой хип.
     
  15. intel_x128

    intel_x128 New Member

    Публикаций:
    0
    Регистрация:
    17 май 2009
    Сообщения:
    345
    И в чем тогда разница между HeapAlloc(HEAP_ZERO_MEMORY) и VirtualAlloc ?
     
  16. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    При чём тут HeapAlloc? malloc и new к HeapAlloc не имеют отношения, они обращаются к своей куче, которая не подвержена никаким ограничениям. А по большому счёту разница в удобстве работы с блоками памяти разного размера.
     
  17. intel_x128

    intel_x128 New Member

    Публикаций:
    0
    Регистрация:
    17 май 2009
    Сообщения:
    345
    Теперь ясно ) Спасибо
     
  18. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Booster
    Некоторое отношение все же имеет. При запросе больших блоков malloc вызывает HeapAlloc. Этот порог регурлиуется ф-иями *_set_threshold_* (как-то так, точное название не помню).

    intel_x128
    HeapAlloc использует VirtualAlloc как низкоуровневый механизм выделения памяти. Если совсем грубо, то при инициализации Windows-кучи запрашивается пул памяти у VirtualAlloc, а потом при обращении к HeapAlloc запрос удовлетворяется из пула.
     
  19. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Mika0x65
    Главное что размер кучи ограничен только размером свободной памяти, а уж через HeapAlloc или как-то иначе это не суть. Наверняка есть компиляторы которые не используют никаких HeapAlloc, в линукс так точно. ^)
     
  20. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    intel_x128
    См. RtlCreateHeap, параметры CommitSize и ReserveSize + флаг HEAP_GROWABLE .
    А также см.HeapCreate, в которой dwInitialSize соотв.CommitSize (он же AllocSize), а dwMaximumSize - если не 0, то соотв. ReserveSize НЕ-растущей кучи, а если 0, то куча растущая и ее нач.ReserveSize берется по умолчанию (обычно = SegmentSize = 1Мб)