![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
null56 |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 721 Регистрация: 19.3.2008 Репутация: 2 Всего: 12 |
Тема поднималась на форуме, но кусками, мне бы хотелось по подробнее разобраться с перегрузкой операторов new и delete и понять их области действия
Прежде всего хочу понять, что же означает
и в каком контексте В качестве примера, я набросал небольшой код, по которому и хочу разобраться... Функция main стандартная
Вот первый вариант кода, который, должен быть правильным (если не так, поправьте обязательно)
Вывод в консоль будет следующим
Что же получается??? NEW: глобальный (???) оператор new вызывает мой перегруженный метод new, в котором уже вызовом :: operator new(size), я создаю объект? DELETE: глобальный () вызывает ДЕСТРУКТОР(???), который потом вызовит мой перегруженный метод, в котором я удалю объект??? Очень странно.... Помогите пожалуйста разобраться, что здесь происходит, что означают вызовы начинающиеся с оператора видимости "::" Дальше пока пример развивать не буду, для начала хотелось бы понять, что происходит здесь Заранее благодарен за помощь... |
||||||||
|
|||||||||
UnrealMan |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
Подробная информация по интересующим тебя вопросам есть в стандарте C++ (ищи pdf файл, а в нём пп. 5.3.4 New, 5.3.5 Delete).
Это сообщение отредактировал(а) UnrealMan - 25.12.2008, 00:25 |
|||
|
||||
null56 |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 721 Регистрация: 19.3.2008 Репутация: 2 Всего: 12 |
Почитал я спецификацию, посмотел файлик new, посмотрел еще вот эту тему...
http://forum.vingrad.ru/forum/topic-241511...y1737737/0.html Не все до конца ясно... 1) new и operator new - это разные вообще вызовы? operator new - выделяет память нужного размера, так как его аргументы могут быть лишь
2) Двоеточие перед new или operator new означает вызов глобальный (НЕ ПЕРЕОПРЕДЕЛННЫХ МНОЙ) методов языка 3) Функция new вызывает operator new с нужными параметрами 3) Вызывая в основной функции new к моим объектам (так как без двоеточия), вызывается глобальная функция new, которая вызывает метод operator new, но вызывает его из мной переопределенного operator new, где я уже ручками должен вызвать глобальный метод operator new(размер объекта), так получается? и вот тогда создается мой объект, поэтому и вызвается конструктор, после чего возращается управление глобальному методу new, который уже инициализирует конструктор значением 4) В случае с деструктором все примерно тоже самое, но глобальный delete сначала вызовет мой деструктор, потом вместо своего глобального operator delete, вызовет мой, где по хорошему (к моему примеру) я должен вызвать глоабльный метод удаления объекта :: operator delete (адрес удаляемого объекта), тогда объект будет удален Правильно я это понимаю, опишите пожалуйста, что не так я написал? Мне кажется, что в конструкторе я не совсем понимаю правильно.... Ранее вы писали
разве это так? Я пытаюсь сделать в своем методе
Но у меня вылетает ошибка сегментации Или так делать нельзя??? Добавлено @ 16:27 и судя по всему метод new "мой объект" генерит не глобальный, как я выражался, а свой, который буддет применяться к моему объекту Это сообщение отредактировал(а) null56 - 25.12.2008, 16:39 |
||||||
|
|||||||
UnrealMan |
|
||||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
В первом случае new - это часть new-expression, а operator new - это allocation function. Параметры могут быть и другими, если определять функции operator new самому. У предопределённых функций operator new параметры такие, как ты привёл.
При наличии двойного двоеточия в new-expression или непосредственно перед operator new вызывается глобальная функция operator new. Нет. При использовании new-expression без :: компилятор сперва ищет operator new в твоём классе. Если поиск этой функции в твоём классе завершился бы неудачей, поиск продолжился бы в global scope. Вот оно правило:
С operator delete аналогично. 1) int &index = 10 - так делать нельзя. 2) :: operator new (size, &index) не будет выделять память. Функция operator new, которая здесь будет вызвана, просто возвращает переданный в неё указатель, чтобы можно было записывать так:
В последней строчке new-expression сначала вызывает ::operator new(sizeof(std::string), p) - при этом ничего полезного не делается - после чего в соответствии с правилом
создаёт объект с помощью соответствующего конструктора. Это сообщение отредактировал(а) UnrealMan - 25.12.2008, 17:47 |
||||||||
|
|||||||||
null56 |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 721 Регистрация: 19.3.2008 Репутация: 2 Всего: 12 |
Блин, спасибо огромнейшее все стало ясно...
По поводу других собственного operator new (мои параметры), чтобы new вызвал его, в смысле нашел... Нужно всего лишь вызвать сам new в соотвествии с правилами с правилами и тогда он сможет вызвать мой operator new и передать нужные параметры в соответствующей последовательности? То есть, если я хочу, допустим передать своему operator new
Я должен в соотвествии с правилами сделать вызвать примерно вот так оператор new
Где в роли expression-list будет ("my string")... Надо просто поиграться и разобраться с правилами... но суть мне теперь ясна... Спасибо еще раз |
||||
|
|||||
UnrealMan |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
Если ты определишь функцию void * MyClass :: operator new (size_t, void *), то она и вызовется как более соответствующая вместо той, что с std::string. А если не определишь, то можешь столкнуться с проблемами, если вдруг захочется использовать такую функцию через new-выражение без :: Это сообщение отредактировал(а) UnrealMan - 25.12.2008, 19:41 |
|||
|
||||
null56 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 721 Регистрация: 19.3.2008 Репутация: 2 Всего: 12 |
Да, это понятно... да и код такой не очень хороший.... это я в пример спросил
Спасибо огромное еще раз |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |