Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
12 / 10 / 1
Регистрация: 12.03.2012
Сообщений: 127
1

Аллокатор в chrome

19.11.2013, 03:45. Показов 808. Ответов 5
Метки нет (Все метки)

Всем привет, начал изучать исходники хрома, в аллокаторе, метод realloc должен возвращать nullptr если передаваемый аргумент size равен нулю:

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
void* realloc(void* ptr, size_t size) __THROW {
  // Webkit is brittle for allocators that return NULL for malloc(0).  The
  // realloc(0, 0) code path does not guarantee a non-NULL return, so be sure
  // to call malloc for this case.
  if (!ptr)
    return malloc(size);
 
  void* new_ptr;
  for (;;) {
#ifdef ENABLE_DYNAMIC_ALLOCATOR_SWITCHING
    switch (allocator) {
      case JEMALLOC:
        new_ptr = je_realloc(ptr, size);
        break;
      case WINHEAP:
      case WINLFH:
        new_ptr = win_heap_realloc(ptr, size);
        break;
      case TCMALLOC:
      default:
        new_ptr = do_realloc(ptr, size);
        break;
    }
#else
    // TCMalloc case.
    new_ptr = do_realloc(ptr, size);
#endif
 
    // Subtle warning:  NULL return does not alwas indicate out-of-memory.  If
    // the requested new size is zero, realloc should free the ptr and return
    // NULL.
    if (new_ptr || !size)
      return new_ptr;
    if (!new_mode || !call_new_handler(true))
      break;
  }
  return new_ptr;
}
При этом в юнит-тестах написано что должно быть наоборот:

C++
1
2
3
4
5
6
7
8
9
10
11
TEST(Allocators, ReallocZero) {
  // Test that realloc to zero does not return NULL.
  for (int size = 0; size >= 0; size = NextSize(size)) {
    char* ptr = reinterpret_cast<char*>(malloc(size));
    EXPECT_NE(static_cast<char*>(NULL), ptr);
    ptr = reinterpret_cast<char*>(realloc(ptr, 0));
    EXPECT_NE(static_cast<char*>(NULL), ptr); // <--- вот
    if (ptr)
      free(ptr);
  }
}
При этом юнит-тестирование на серверах гугла проходится. В чём собственно загвоздка?
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.11.2013, 03:45
Ответы с готовыми решениями:

Класс аллокатор
Какие требования к написанию класса Аллокатора?

Пишем аллокатор
дабы не захламлять и так уже захламленную тему про перегрузку операторов создаю новую тему,...

Быстрый аллокатор
Собственно, необходим аллокатор для быстрого выделения памяти под мелкие объекты, совместимый со...

Кастомный аллокатор
Не уверен, что это &quot;для начинающих&quot;, но этот раздел подходил больше всех. Итак, объясню вкратце...

5
Tulosba
19.11.2013, 13:04
  #2

Не по теме:

Цитата Сообщение от kvadro Посмотреть сообщение
В чём собственно загвоздка?
Наверное просто гугл не хочет платить Вам $$$ за найденную ошибку :)

0
501 / 350 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
19.11.2013, 13:27 3
Цитата Сообщение от kvadro Посмотреть сообщение
Всем привет, начал изучать исходники хрома, в аллокаторе, метод realloc должен возвращать nullptr если передаваемый аргумент size равен нулю:
Это где написанно.
0
12 / 10 / 1
Регистрация: 12.03.2012
Сообщений: 127
19.11.2013, 13:39  [ТС] 4
Это где написанно.
// Subtle warning: NULL return does not alwas indicate out-of-memory. If
// the requested new size is zero, realloc should free the ptr and return
// NULL
Собственно стандартный realloc так и поступин, но например je_realloc - нет.
0
:)
Эксперт С++
4769 / 3263 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
19.11.2013, 14:15 5
Цитата Сообщение от kvadro Посмотреть сообщение
Собственно стандартный realloc так и поступин
Отсюда http://www.cplusplus.com/refer... b/realloc/ :
Для С++98:
A null-pointer indicates either that size was zero (an thus ptr was deallocated), or that the function did not allocate storage (and thus the block pointed by ptr was not modified).
Для С++11:
A null-pointer indicates that the function failed to allocate storage, and thus the block pointed by ptr was not modified.
Как видим, во втором варианте size не упоминается вовсе.
Цитата Сообщение от kvadro Посмотреть сообщение
но например je_realloc - нет.
А где сказано как он должен себя вести?
0
12 / 10 / 1
Регистрация: 12.03.2012
Сообщений: 127
19.11.2013, 17:13  [ТС] 6
А где сказано как он должен себя вести?
Какая разница где, у них своя обёртка над realloc. Стандартная реализация realloc вернёт указатель, реализация je_realloc вернёт nullptr. Я конечно могу предположить что jemalloc реализовали для галочки и его никто не тестил ( ибо основной менеджер памяти считается tcmalloc ), но с тестированием operator new тоже траблы. Так что я думаю что юнит-тесты аллокатора не производятся вообще.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.11.2013, 17:13

Пародия на стековый аллокатор
здравствуйте, решил тут чуток поиграться... сделать аллокатор чтобы данные в статическом буфере...

Аллокатор памяти общего назначения
Добрый день! В ВУЗе задали написать аллокатор памяти общего назначения на С++, но у меня нет ни...

Задача с собеседования (аллокатор памяти)
Вопрос звучит так: &quot;Напишите быстрый аллокатор памяти&quot; Как я его понимаю: можно пожертвовать...

Аллокатор malloc, как избавиться от CRT
Вот рабочий код HANDLE hFile = CreateFile(&quot;temp.txt&quot;, GENERIC_READ, FILE_SHARE_READ, NULL,...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.