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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 29, средняя оценка - 5.00
taras atavin
3570 / 1754 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
#1

Перегрузка new - C++

25.02.2010, 07:30. Просмотров 3798. Ответов 17
Метки нет (Все метки)

Дайте примеры на перегрузку.
C++
1
2
3
4
#define n ... // Некая целая константа
class a { ... }; // Некий класс
a *p=new a; // Здесь должен быть вызван перегруженный оператор. Как его перегрузить и где?
a *p=new a[n]; // Здесь должен быть вызван перегруженный оператор. Как его перегрузить и где?
.

Добавлено через 1 час 44 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class a
{
 protected:
  void * operator new (size_t size) // Почему так нельзя?
  {
   a *p;
   p=(a *)malloc(size);
   return p;
  }  
 public:
  a()
  {
  }
};
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.02.2010, 07:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перегрузка new (C++):

Перегрузка в виде метода VS Перегрузка в виде функции друг - C++
Привет! Собственно сабж: В каких случаях используется перегрузка в виде метода, а когда в виде функции друг? Добавлено через 4...

Множественное наследование, Перегрузка функций, Перегрузка операторов, Использование дружественных функций и классов, Использование шаблонов классов - C++
Здравствуйте!!! Я бы хотел попросить помоч решить...ну или скинуть примеры таких задач, если вдруг у вас они завалялись на компе или...

Перегрузка [][] - C++
Возможно ли для данного класса обеспечить перегрузку жвойных скобок с тем, чтобы в программе можно было использовать выражения типа: ...

Перегрузка в c++ - C++
Собственно для чего нужна перегрузка функций или операторов ?

перегрузка >> и << - C++
Решил попробовать перегрузить операции ввода и вывода,почему то выводятся 0, вместо нужных значений,подскажите в чем косяк #include...

Перегрузка ++ и -- - C++
У меня было задание: Напишите программу работы со временем, в которой используются перегруженные операции ++ и --, которые работают в...

17
Patch
2277 / 492 / 11
Регистрация: 01.04.2009
Сообщений: 2,178
25.02.2010, 07:54 #2
Цитата Сообщение от taras atavin Посмотреть сообщение
Дайте примеры на перегрузку.
Долго думал зачем это вообще надо... не придумал.
Задача оператора new - выделять память.
Все остальное делается в конструкторе.
У class a{} как-то по-особому память выделяется, что-ли?
0
taras atavin
3570 / 1754 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
25.02.2010, 07:57  [ТС] #3
Память под экземпляры этого класса вообще не должна выделяться никуда, кроме его защищённых static-членов.
0
Patch
2277 / 492 / 11
Регистрация: 01.04.2009
Сообщений: 2,178
25.02.2010, 11:41 #4
Цитата Сообщение от taras atavin Посмотреть сообщение
Память под экземпляры этого класса вообще не должна выделяться никуда, кроме его защищённых static-членов.
тем более...
задача из разряда brainfuck.
0
solar_wind
757 / 748 / 42
Регистрация: 06.07.2009
Сообщений: 2,970
Завершенные тесты: 1
25.02.2010, 12:16 #5
Patch, На самом деле перегрузка new и delete очень полезная штука для отладки программ, поиска утечек памяти.
Я перегружал так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
inline void   operator delete(void* ptr)
 {
     free(ptr);
 }
 
 inline void   operator delete[](void* ptr)
 {
     free(ptr);
 }
 
      inline void * __cdecl operator new(unsigned int size,const char *file, int line)
      {   
          void *ptr = (void *)malloc(size);
          return(ptr);
      };
 
      inline void * __cdecl operator new [](unsigned int size,const char *file, int line)
      {   
          void *ptr = (void *)malloc(size);
          return(ptr);
      };
1
taras atavin
3570 / 1754 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
25.02.2010, 12:51  [ТС] #6
Спасибо. Это прямо в проге? А в классе нельзя? Мне надо закрыть создание динамических экземляров везде, кроме привэйт массива-члена со статик указателем.
0
solar_wind
757 / 748 / 42
Регистрация: 06.07.2009
Сообщений: 2,970
Завершенные тесты: 1
25.02.2010, 12:54 #7
Я кидал все в h файл, и его подключал ко всем файлам проекта.
Перегрузить для отдельного класса тоже походу можно примерно так же, но у меня такой необходимости не было, так что не знаю получится или нет, возможно компилятор не даст.
0
CheshireCat
Эксперт С++
2896 / 1245 / 78
Регистрация: 27.05.2008
Сообщений: 3,405
25.02.2010, 13:02 #8
Цитата Сообщение от taras atavin Посмотреть сообщение
Память под экземпляры этого класса вообще не должна выделяться никуда, кроме его защищённых static-членов.
Вот как раз для этого и подойдет перегрузка new и delete:
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
#include <iostream>
using namespace std;
 
struct X
{
    X() {};
    ~X() {};
    static X* clone() { return new X; }
    static void destroy(X* obj) { delete obj; }
 
protected:
    void* operator new(size_t bytes) { return ::operator new(bytes); }
    void operator delete(void* p) { ::operator delete(p); }
};
 
int main()
{
  // это не скомпилируется:
  // X* px = new X;
  // delete px;
  
  // а вот это ок:
  X* px = X::clone();
  X::destroy(px);
 
  return 0;
}
Добавлено через 49 секунд
Ну и аналогично с new[] и delete[].
0
Patch
2277 / 492 / 11
Регистрация: 01.04.2009
Сообщений: 2,178
25.02.2010, 13:31 #9
Цитата Сообщение от vitaly1981 Посмотреть сообщение
Patch, На самом деле перегрузка new и delete очень полезная штука для отладки программ, поиска утечек памяти.
Пожалуй, в таком контексте - да.
Не приходило в голову ловить утечки таким способом.
Как-то сразу привык на любое выделение памяти сразу писать в деструкторе
C++
1
2
3
4
if(lpX){
 delete lpX;
lpX = 0;
}
уже на уровне рефлекса.

Ок, убедили. Может где-то кому-то и помочь.
0
solar_wind
757 / 748 / 42
Регистрация: 06.07.2009
Сообщений: 2,970
Завершенные тесты: 1
25.02.2010, 13:38 #10
Цитата Сообщение от Patch Посмотреть сообщение
Как-то сразу привык на любое выделение памяти сразу писать в деструкторе
Когда объектов много, они выделяются динамически, их заранее неизвестное число, и они могут в любой момент уничтожаться и создаваться, а так же разным образом друг с другом взаимодействовать, боюсь такое не прокатит...
0
CheshireCat
Эксперт С++
2896 / 1245 / 78
Регистрация: 27.05.2008
Сообщений: 3,405
25.02.2010, 13:48 #11
Почему же не прокатит? Непосредственно в момент входа в тело деструктора (в тот самый момент, когда поток управления проходит открывающую скобку) объект уже считается "несуществующим" и должен освободить все захваченные ресурсы.
Другое дело, что в многопоточной программе один поток может уже начать выполнение деструктора, а другой, не подозревая об этом, попытаться использовать этот объект..... Но это уже - не проблемы языка как такового, а проблемы проектирования.
0
solar_wind
757 / 748 / 42
Регистрация: 06.07.2009
Сообщений: 2,970
Завершенные тесты: 1
25.02.2010, 14:04 #12
CheshireCat, Понятное дело, что это не проблема языка. Но как не проектируй, далеко не всегда можно свести к тому, что все объекты будут создаваться в конструкторе, а уничтожаться в деструкторе.
0
CheshireCat
Эксперт С++
2896 / 1245 / 78
Регистрация: 27.05.2008
Сообщений: 3,405
25.02.2010, 14:19 #13
А каким еще образом они могут создаваться?
0
Patch
2277 / 492 / 11
Регистрация: 01.04.2009
Сообщений: 2,178
25.02.2010, 14:21 #14
Цитата Сообщение от vitaly1981 Посмотреть сообщение
Когда объектов много, они выделяются динамически, их заранее неизвестное число, и они могут в любой момент уничтожаться и создаваться, а так же разным образом друг с другом взаимодействовать, боюсь такое не прокатит...
Еще как прокатит.
Простые правила:
1)при создании указателя на объект всегда его обнуляй.
2)при удалении объекта - опять-же обнуляй его указатель.
Все.
Неважно, что когда, где, как, и в каких количествах ты делал с указателями на объекты,
в деструкторе проверяется не равны ли они нулю, и если нет - объекты удаляются.
1
CheshireCat
Эксперт С++
2896 / 1245 / 78
Регистрация: 27.05.2008
Сообщений: 3,405
25.02.2010, 14:25 #15
На самом деле, можно и не проверять. delete NULL; (равно как и free(NULL); ) безопасно по Стандарту.
0
25.02.2010, 14:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.02.2010, 14:25
Привет! Вот еще темы с ответами:

Перегрузка << и >> - C++
помогите сделать так чтобы &lt;&lt; и &gt;&gt; в int main() работали... Printers.h class Printers { public: ...

Перегрузка в c++ - C++
Зачем нужно использовать перегрузку в c++? Этот вопрос будет у меня на экзамене, поэтому хочу услышать ваши версии

перегрузка [] - C++
Здарова никак не могу перегрузить имеется класс Int2 моделирующий int я перегрузил rvalue тоесть при вызове int a; Int2...

Перегрузка + - C++
код: #include &lt;iostream&gt; #include &lt;vector&gt; using namespace std; template &lt;class T &gt; class theMatrix { ...


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

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

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