Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 29, средняя оценка - 5.00
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
25.02.2010, 07:30     Перегрузка new #1
Дайте примеры на перегрузку.
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()
  {
  }
};
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.02.2010, 07:30     Перегрузка new
Посмотрите здесь:

C++ Перегрузка << и >>
Перегрузка ++ C++ Builder
Перегрузка в c++ C++
C++ перегрузка []
Перегрузка () C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Patch
2276 / 491 / 11
Регистрация: 01.04.2009
Сообщений: 2,178
25.02.2010, 07:54     Перегрузка new #2
Цитата Сообщение от taras atavin Посмотреть сообщение
Дайте примеры на перегрузку.
Долго думал зачем это вообще надо... не придумал.
Задача оператора new - выделять память.
Все остальное делается в конструкторе.
У class a{} как-то по-особому память выделяется, что-ли?
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
25.02.2010, 07:57  [ТС]     Перегрузка new #3
Память под экземпляры этого класса вообще не должна выделяться никуда, кроме его защищённых static-членов.
Patch
2276 / 491 / 11
Регистрация: 01.04.2009
Сообщений: 2,178
25.02.2010, 11:41     Перегрузка new #4
Цитата Сообщение от taras atavin Посмотреть сообщение
Память под экземпляры этого класса вообще не должна выделяться никуда, кроме его защищённых static-членов.
тем более...
задача из разряда brainfuck.
solar_wind
 Аватар для solar_wind
740 / 731 / 39
Регистрация: 06.07.2009
Сообщений: 2,937
Завершенные тесты: 1
25.02.2010, 12:16     Перегрузка new #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);
      };
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
25.02.2010, 12:51  [ТС]     Перегрузка new #6
Спасибо. Это прямо в проге? А в классе нельзя? Мне надо закрыть создание динамических экземляров везде, кроме привэйт массива-члена со статик указателем.
solar_wind
 Аватар для solar_wind
740 / 731 / 39
Регистрация: 06.07.2009
Сообщений: 2,937
Завершенные тесты: 1
25.02.2010, 12:54     Перегрузка new #7
Я кидал все в h файл, и его подключал ко всем файлам проекта.
Перегрузить для отдельного класса тоже походу можно примерно так же, но у меня такой необходимости не было, так что не знаю получится или нет, возможно компилятор не даст.
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,309
25.02.2010, 13:02     Перегрузка new #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[].
Patch
2276 / 491 / 11
Регистрация: 01.04.2009
Сообщений: 2,178
25.02.2010, 13:31     Перегрузка new #9
Цитата Сообщение от vitaly1981 Посмотреть сообщение
Patch, На самом деле перегрузка new и delete очень полезная штука для отладки программ, поиска утечек памяти.
Пожалуй, в таком контексте - да.
Не приходило в голову ловить утечки таким способом.
Как-то сразу привык на любое выделение памяти сразу писать в деструкторе
C++
1
2
3
4
if(lpX){
 delete lpX;
lpX = 0;
}
уже на уровне рефлекса.

Ок, убедили. Может где-то кому-то и помочь.
solar_wind
 Аватар для solar_wind
740 / 731 / 39
Регистрация: 06.07.2009
Сообщений: 2,937
Завершенные тесты: 1
25.02.2010, 13:38     Перегрузка new #10
Цитата Сообщение от Patch Посмотреть сообщение
Как-то сразу привык на любое выделение памяти сразу писать в деструкторе
Когда объектов много, они выделяются динамически, их заранее неизвестное число, и они могут в любой момент уничтожаться и создаваться, а так же разным образом друг с другом взаимодействовать, боюсь такое не прокатит...
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,309
25.02.2010, 13:48     Перегрузка new #11
Почему же не прокатит? Непосредственно в момент входа в тело деструктора (в тот самый момент, когда поток управления проходит открывающую скобку) объект уже считается "несуществующим" и должен освободить все захваченные ресурсы.
Другое дело, что в многопоточной программе один поток может уже начать выполнение деструктора, а другой, не подозревая об этом, попытаться использовать этот объект..... Но это уже - не проблемы языка как такового, а проблемы проектирования.
solar_wind
 Аватар для solar_wind
740 / 731 / 39
Регистрация: 06.07.2009
Сообщений: 2,937
Завершенные тесты: 1
25.02.2010, 14:04     Перегрузка new #12
CheshireCat, Понятное дело, что это не проблема языка. Но как не проектируй, далеко не всегда можно свести к тому, что все объекты будут создаваться в конструкторе, а уничтожаться в деструкторе.
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,309
25.02.2010, 14:19     Перегрузка new #13
А каким еще образом они могут создаваться?
Patch
2276 / 491 / 11
Регистрация: 01.04.2009
Сообщений: 2,178
25.02.2010, 14:21     Перегрузка new #14
Цитата Сообщение от vitaly1981 Посмотреть сообщение
Когда объектов много, они выделяются динамически, их заранее неизвестное число, и они могут в любой момент уничтожаться и создаваться, а так же разным образом друг с другом взаимодействовать, боюсь такое не прокатит...
Еще как прокатит.
Простые правила:
1)при создании указателя на объект всегда его обнуляй.
2)при удалении объекта - опять-же обнуляй его указатель.
Все.
Неважно, что когда, где, как, и в каких количествах ты делал с указателями на объекты,
в деструкторе проверяется не равны ли они нулю, и если нет - объекты удаляются.
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,309
25.02.2010, 14:25     Перегрузка new #15
На самом деле, можно и не проверять. delete NULL; (равно как и free(NULL); ) безопасно по Стандарту.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
26.02.2010, 04:48  [ТС]     Перегрузка new #16
Цитата Сообщение от vitaly1981 Посмотреть сообщение
Я кидал все в h файл, и его подключал ко всем файлам проекта.
Перегрузить для отдельного класса тоже походу можно примерно так же, но у меня такой необходимости не было, так что не знаю получится или нет, возможно компилятор не даст.
В public дал. Но мне в pulic не надо. Мне надо в private и в protected.

Добавлено через 3 минуты
Цитата Сообщение от CheshireCat Посмотреть сообщение
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); } };
Это точно должно компилиться? У меня не получилось. Или я что-то не так делаю? Или "сайт для экспериментов с программами" и в этом плане отличается, например, от gcc?

Добавлено через 5 минут
Нашел причину. не фурычит, всё эйси.

Добавлено через 46 секунд
Цитата Сообщение от CheshireCat Посмотреть сообщение
На самом деле, можно и не проверять. delete NULL; (равно как и free(NULL); ) безопасно по Стандарту.
Я привык проверять. И нафиг мне освобождать несуществующую память по указателю в никуда?
insideone
Модератор
Автор FAQ
 Аватар для insideone
3623 / 901 / 48
Регистрация: 10.01.2010
Сообщений: 2,429
26.02.2010, 18:23     Перегрузка new #17
Цитата Сообщение от taras atavin Посмотреть сообщение
Я привык проверять. И нафиг мне освобождать несуществующую память по указателю в никуда?
Она как раз и безопасна тем что ничего освобождаться не будет, т.к. все сработает наподобии if ( p == NULL ) return;. Другими словами ваша проверка оказывается дублирующей) Хотя я понимаю, как то некомфортно Сам проверяю... тоже привычка

Цитата Сообщение от taras atavin Посмотреть сообщение
В public дал. Но мне в pulic не надо. Мне надо в private и в protected.
Мне кажется тут вариантов не так то много. Если вы пишите private то можете вызывать только в методах класса или в дружественных функциях\классах\... . Если protected то только в своих...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.02.2010, 18:34     Перегрузка new
Еще ссылки по теме:

перегрузка -- C++
Перегрузка >> C++
C++ Перегрузка ++ и --

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

Или воспользуйтесь поиском по форуму:
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
26.02.2010, 18:34     Перегрузка new #18
Цитата Сообщение от taras atavin Посмотреть сообщение
Мне надо в private и в protected
Для чего тебе это?
Yandex
Объявления
26.02.2010, 18:34     Перегрузка new
Ответ Создать тему
Опции темы

Текущее время: 21:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru