Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как создать объект динамически, без использования new 
:(
    Опции темы
Чупакабро
Дата 16.10.2013, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: нет
Всего: 4



Цитата(Alexeis @  16.10.2013,  11:24 Найти цитируемый пост)
При множественном наследовании будет несколько таблиц VMT и они будут размещены с различными смещениями. 

Вот очень занятная статья на эту тему
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
vinter
Дата 16.10.2013, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 8
Всего: 56



Чупакабро, т.е Вы решили, что отказавшись от new, Вы отказываетесь от CRT? Я Вам может открою тайну, но прежде чем начнёт исполнятся первая же строчка функции main CRT уже используется на всю катушку. 


--------------------
Мой блог
PM MAIL WWW   Вверх
Чупакабро
Дата 16.10.2013, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: нет
Всего: 4



Цитата(vinter @  16.10.2013,  11:31 Найти цитируемый пост)
Я Вам может открою тайну, но прежде чем начнёт исполнятся первая же строчка функции main CRT уже используется на всю катушку.

Entry Point находится у меня в программе, я немного подшаманил, если вы об этом))
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
DarthTon
Дата 16.10.2013, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 106
Регистрация: 7.2.2009

Репутация: 1
Всего: 6



CRT это не только new/delete. Это ещё и 'scalar deleting destructor', 'vector deleting destructor' и собственно тот самый _vftable. Без CRT не выйдет сделать виртуальное наследование. Если уж так не хочется использовать new то можно так:
Код

Derived *pMemory = (Derived*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(Derived));
pMemory->Derived::Derived();

PM MAIL   Вверх
Чупакабро
Дата 16.10.2013, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: нет
Всего: 4



Цитата(DarthTon @  16.10.2013,  11:42 Найти цитируемый пост)
Если уж так не хочется использовать new то можно так

Да да да! Я так пробовал, см. предыдущую страницу. Работает.
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
vinter
Дата 16.10.2013, 11:50 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 8
Всего: 56



тем не менее это UB


--------------------
Мой блог
PM MAIL WWW   Вверх
Чупакабро
Дата 16.10.2013, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: нет
Всего: 4



Цитата(vinter @  16.10.2013,  11:50 Найти цитируемый пост)
тем не менее это UB 

А как это переводится? )))
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
vinter
Дата 16.10.2013, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 8
Всего: 56



undefined behavior. В C++ нет решения Вашей проблемы без new. Всё что здесь предлагается в качестве решения является некорректным C++ кодом.


--------------------
Мой блог
PM MAIL WWW   Вверх
Чупакабро
Дата 16.10.2013, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: нет
Всего: 4



vinter
ну что ж, начнет глючить - придется отказаться от ООП. Пока работает.
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
DarthTon
Дата 16.10.2013, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 106
Регистрация: 7.2.2009

Репутация: 1
Всего: 6



Цитата

Без CRT не выйдет сделать виртуальное наследование.

Похоже я соврал smile. Таки можно, главное отключить RTTI и перегрузить operator delete. 

Это сообщение отредактировал(а) DarthTon - 16.10.2013, 12:06
PM MAIL   Вверх
vinter
Дата 16.10.2013, 12:07 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 8
Всего: 56



Оно может начать глючить так, что Вы проблему месяц будете искать. А если начнёт у клиента, то там вообще будет песня. Отлаживать программу полную UB будет очень весело. А самое то главное, зачем? Неужели сложно писать на чистом C? Коли уж Вы не можете какой-нибудь установщик осилить(WiX, к примеру)
Ну и напоследок. ООП это не классы, ООП возможен и в чистом C. Классы лишь удобная сущность для реализации ООП подхода, не более того. Поэтому наличие классов в программе не делает её ОО, равно как и их отсутствие не говорит об отсутствии ОО подхода при её написании.


--------------------
Мой блог
PM MAIL WWW   Вверх
feodorv
Дата 16.10.2013, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(Чупакабро @  16.10.2013,  12:26 Найти цитируемый пост)
рантайм насолил тем, что нужно а) обеспечить запуск приложения на чистой системе, в которой может не быть msvcrtXX от моей студии

Это довольно распространённая проблема)))
Если не хотите таскать с собой свой вариант этой dll, то можно попробовать воспользоваться следующим советом:
Цитата
Взять из VC++ 6 версии библиотеку MSVCRT.LIB
Данную библиотеку кинуть в папку с программой (или в папку с библиотеками) под именем MSVCRTOLD.LIB
В свойствах проекта задать Свойства конфигурации -> Компоновщик -> Ввод -> Игнорировать все стандартные библиотеки - Да (/NODEFAULTLIB).
Добавить в параметры линковки (Свойства конфигурации -> Компоновщик -> Командная строка -> Дополнительные параметры) библиотеку MSVCRTOLD.LIB
После такого рода манипуляции программа будет использовать CRT из msvcrt.dll, которая по дефолту есть в каждой Windows, начиная с древних времен.
Такой подход помогает во многих случаях, за исключением тех, где используется новые функции, которых не было в старых версиях CRT. Так что будьте внимательны. Ну и конечно же придется еще чуть по играться с параметрами компиляции.

(для C++ проектов я не пробовал; взято отсюда).


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
baldina
Дата 16.10.2013, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



зачем огород городить? можно линковать со статическими библиотеками
http://msdn.microsoft.com/ru-ru/library/2kzt1wy3.aspx

Добавлено через 2 минуты и 49 секунд
Цитата(vinter @  16.10.2013,  12:07 Найти цитируемый пост)
WiX, к примеру

любой установщик, конечно, использует crt. как же они это делают...  smile 
PM MAIL   Вверх
feodorv
Дата 16.10.2013, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(baldina @  16.10.2013,  13:22 Найти цитируемый пост)
можно линковать со статическими библиотеками

Кстати да, если у Вас практически нет вызовов CRT, то размер экзешника при этом увеличится незначительно.


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
vinter
Дата 16.10.2013, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 8
Всего: 56



Цитата

любой установщик, конечно, использует crt. как же они это делают...  

Я тебя не понял. Я имел ввиду распространение CRT вместе с исполняемым файлом. А еще лучше установка MSVC redistributable вместе со своим софтом. Это как раз нормальный путь распространения.


--------------------
Мой блог
PM MAIL WWW   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0579 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.