Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Что это за компонент? https://www.cyberforum.ru/ cpp/ thread300352.html
Всем привет. Кто ни будь, знает в какой библиотеке есть компоненты: TLight и TTrend ? Знакомы ли вообще такие названия кому ни будь?
Visual C++ и Builder C++ сильно отличаются друг от друга? C++
Доброго времени суток. У меня такой вопрос, Visual C++ и Builder C++ сильно отличаются друг от друга? Например если прога была написана в Visual, то будет ли она корректно работать в Builder?
Комментарий в коде C++
как в С++ делать коментр?? в паскале так: { bla bla} а в С++ как???
C++ Списки, динамическая память и указатели Нужна помощь! Требуется написать функцию rearrangment( ), меняющую i-ю и j-ю строки текста. То бишь нужно создать однонаправленный список, в который заносится построчно текст какой-либо уже... https://www.cyberforum.ru/ cpp/ thread298945.html
C++ Найти решение - на разные темы https://www.cyberforum.ru/ cpp/ thread298385.html
Доброго времени суток!!! Уважаемые форумчанины, требуется помощь в решении задач по С++. За 1,5 месяца не смог разобраться ни в одном компиляторе. У меня видимо руки не оттуда растут, или эти...
C++ После всякиго ли компилятора c++ будут гарантирвоано правильно исполняться код, соответствющий этим строкам?
После всякиго ли компилятора c++ будут гарантирвоано правильно исполняться код, соответствующий этим: a=a; // Удвоение a*=a; // Возведение в квадрат строкам. 1. На сколько надёжно компилится...
C++ C++ и принтеры
Приветствую уважаемые программисты! У меня есть сканер и принтер, и достаточно много документов которые нужно ксерить. Просто нажимать "сканировать", потом "печать" уже надоело. Появилась идея...
C++ Перезагрузка программы с заданными входными параметрами Добрый день. В общем есть программа, которая на вход получает имя файла конфигурации. Нужно ее програмно перезагрузить, указав имя нужного файла конфигурации. Кто нибудь знает методы, позволяющие это... https://www.cyberforum.ru/ cpp/ thread296064.html
C++ Windows Driver Kit https://www.cyberforum.ru/ cpp/ thread296009.html
Здравствуйте. ОС Windows 7 Максимальная 32bit. Отсюда качал Windows Driver Kit 7.1.0. Образ запускал в DAEMON Tools Lite 4.35 (работает без сбоев). Антивирус DrWeb выключал - не помогает. При...
C++ Событие FormClosed У меня есть две формы (Form1 и Form2). Мне нужно, чтобы при закрытии Form2, в Form1 происходили определенные действия. Я пытался создать обработчик закрытия Form2(FormClosed) в классе Form1, но у... https://www.cyberforum.ru/ cpp/ thread294008.html
Evg
Эксперт CАвтор FAQ
21146 / 8162 / 628
Регистрация: 30.03.2009
Сообщений: 22,463
Записей в блоге: 30
20.05.2011, 15:45 0

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

20.05.2011, 15:45. Просмотров 20201. Ответов 35
Метки (Все метки)

Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от 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


Вернуться к обсуждению:
realloc и вызов конструктора
6
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.05.2011, 15:45

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Вызов базового конструктора
Такая вот ситуация. Думаю, проблема в объявлении и инициализации массива m. Я бы инициализировал...

Неоднозначный вызов конструктора
class Verylong{ public: Verylong (long x = 0) { enter(x);} Verylong (const...

Вызов копирующего конструктора
Помогите привести примеры для всех случаев.. Копирующий конструктор вызывается в следующих...

Вызов конструктора с аргументами
есть класс приложения test_proj в интерфейсе класса в файле test_proj.h создается объект класса...

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