Форум программистов, компьютерный форум, киберфорум
Наши страницы

realloc и вызов конструктора - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Что это за компонент? http://www.cyberforum.ru/cpp/thread300352.html
Всем привет. Кто ни будь, знает в какой библиотеке есть компоненты: TLight и TTrend ? Знакомы ли вообще такие названия кому ни будь?
C++ Visual C++ и Builder C++ сильно отличаются друг от друга? Доброго времени суток. У меня такой вопрос, Visual C++ и Builder C++ сильно отличаются друг от друга? Например если прога была написана в Visual, то будет ли она корректно работать в Builder? http://www.cyberforum.ru/cpp/thread300349.html
Комментарий в коде C++
как в С++ делать коментр?? в паскале так: { bla bla} а в С++ как???
Списки, динамическая память и указатели C++
Нужна помощь! Требуется написать функцию rearrangment( ), меняющую i-ю и j-ю строки текста. То бишь нужно создать однонаправленный список, в который заносится построчно текст какой-либо уже...
C++ Найти решение - на разные темы http://www.cyberforum.ru/cpp/thread298385.html
Доброго времени суток!!! Уважаемые форумчанины, требуется помощь в решении задач по С++. За 1,5 месяца не смог разобраться ни в одном компиляторе. У меня видимо руки не оттуда растут, или эти...
C++ После всякиго ли компилятора c++ будут гарантирвоано правильно исполняться код, соответствющий этим строкам? После всякиго ли компилятора c++ будут гарантирвоано правильно исполняться код, соответствующий этим: a=a; // Удвоение a*=a; // Возведение в квадрат строкам. 1. На сколько надёжно компилится... подробнее

Показать сообщение отдельно
Evg
Эксперт CАвтор FAQ
18374 / 6421 / 441
Регистрация: 30.03.2009
Сообщений: 17,813
Записей в блоге: 28
20.05.2011, 15:45
Цитата Сообщение от oxotnik Посмотреть сообщение
Под какую такую информацию надо резервировать доп. память?
А что тогда sizeof будет показывать?
glibc'шная реализация malloc'f при каждом обращении выделяет памяти больше, чем нужно. И в дополнительную память кладёт магическое число, чтобы делать контроль внутри realloc'а и free. Схематично что-то типа того:

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
void*
malloc (long size)
{
  char *p;
 
  /* Функцию, которая по-настоящему выделяет память, условно назвал get_mem.
   * В реальности там всё куда сложнее, я просто хочу пояснить принцип
   * Здесь мы выделили дополнительный фрагмент памяти */
  p = get_mem (sizeof (long) + size);
 
  /* В начало реально выделенной памяти кладём магическое число */
  *((long*)p) = 0xdeadbeef;
 
  /* Наружу отдаём память, лежащую за магическим числом */
  return p + sizeof (long);
}
 
void free (void *ptr)
{
  char *p;
 
  /* Наружу мы отдавали результат get_mem со сдвигом. Теперь вернём значение
   * обратно, получив таким образом то, что реально выдал get_mem */
  p = ptr - sizeof (long);
 
  if (*((long*)p) != 0xdeadbeef)
  {
    /* АХТУНГ! Магическое число не совпадает. Вероятнее всего в free подали
     * совсем не то, что вернул malloc */
  }
 
  /* Название функции free_mem условное */
  free_mem (p);
}
Пи таком построении всё читерство с магическими числами сосредоточено внутри интерфейсов malloc и free и для пользователя оно всё прозрачно. Т.е. пользовтатель получил указатель, который вернул malloc, а затем отдал этот указатель в free. То, что это не есть результат настоящего выделения памяти, а результат со сдвигом, снаружи никак не проявляется.

Ровно таким же образом могут быть реализованы операторы new и delete. Т.е. new внутри себя использует malloc, но наружу может отдать немного не то, что вернул malloc

Пример, как это работает в glibc под linux'ом:

C
1
2
3
4
5
6
7
8
9
10
11
#include <stdlib.h>
 
int main (void)
{
  int *p;
  
  p = malloc (100);
  /* Некорректный вызов free */
  free (p + 10);
  return 0;
}
На исполнении видим, что сработал Ахтунг

Код
$ gcc t.c
$ ./a.out
*** glibc detected *** ./a.out: free(): invalid pointer: 0x0804b030 ***
Aborted
6
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.