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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как вручную вызвать конструктор? ...без использования new 
:(
    Опции темы
A.V.N.
Дата 9.12.2005, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Добрый день smile !

Возник такой вопрос:

Код

class A
{
private:
  int a;
public:
  A (const int Value): a(Value) {}
  int get (void) const   { return a;}
};

A *a;

// ...

a = (A*) malloc (sizeof (A));

// как вызвать a->A(10) ???


Чего-то не догоняю smile
PM MAIL   Вверх
nikitao
Дата 9.12.2005, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


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

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



А почему ты new не используешь???


--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
A.V.N.
Дата 9.12.2005, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(nikitao @ 9.12.2005, 13:59)
А почему ты new не используешь???

Нестандартное управление памятью. Собственно, new тоже может быть переопределен smile ...
PM MAIL   Вверх
Ignat
Дата 9.12.2005, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

Репутация: 3
Всего: 73



Цитата(A @ 9.12.2005, 17:03)
Нестандартное управление памятью.

Зря вы так...
Цитата(Bjarne)
The C++ operators new and delete guarantee proper construction and destruction; where constructors or destructors need to be invoked, they are. The C-style functions malloc(), calloc(), free(), and realloc() doesn't ensure that. Furthermore, there is no guarantee that the mechanism use by new and delete to acquire and release raw memory is compatible with malloc() and free(). If mixing styles works on your system, you were simply "lucky" - for now.



--------------------
Теперь при чем :P
PM   Вверх
nikitao
Дата 9.12.2005, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


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

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



Цитата(Ignat @ 9.12.2005, 18:08)
Зря вы так...

Я так понял,что это не new-нестандартное выделение памяти,а A.V.N. использует нестандартное выделение памяти(зачем то) т е ему так надо.

smile
У меня смешно Promt перевел:
Цитата
C ++ новые операторы и удаляют гарантию надлежащее строительство{сооружение} и разрушение{уничтожение}; где конструкторы или печи для сжигания отходов производства должны быть призваны, они. Функции C-стиля malloc (), calloc (), свободный (), и realloc () не гарантируют этому. Кроме того, нет никакой гарантии, что использование механизма новым и удаляет, чтобы приобрести, и выпускать сырую память совместимо с malloc () и свободно (). Смешивая стили воздействует на вашу систему, Вы просто получили шанс - пока.

smile


--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
S.A.P.
Дата 9.12.2005, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 9
Всего: 71



Цитата(Ignat @ 9.12.2005, 17:08)
Нестандартное управление памятью.

Зря вы так...

Наверное он хотел сказать, что нестандартное выделение памяти рулит и всякими new ами пользоваться не понтово smile . Тогда уж используй не malloc, а GlobalAlloc если под виндой smile .
PM MAIL   Вверх
Romikgy
Дата 9.12.2005, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



Мож так
Код


(*a)(10);


Это сообщение отредактировал(а) Romikgy - 9.12.2005, 17:21


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Ignat
Дата 9.12.2005, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

Репутация: 3
Всего: 73



Цитата(Perchilla @ 9.12.2005, 17:17)
Тогда уж используй не malloc, а GlobalAlloc если под виндой

Ты сейчас научишь smile

Просто это, возможно, задание двинутого препода, который Страуструпа никогда не читал-то.


--------------------
Теперь при чем :P
PM   Вверх
A.V.N.
Дата 9.12.2005, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Ignat @ 9.12.2005, 14:08)
Цитата(Bjarne)
The C++ operators new and delete guarantee proper construction and destruction; where constructors or destructors need to be invoked, they are... If mixing styles works on your system, you were simply "lucky" - for now.

Так-то оно так, но new и delete не гарантируют АВТОУНИЧТОЖЕНИЕ объектов!

Да, можно сделать класс-оболочку, который это сделает сам.

Но следом возникает мысль: а вот если бы можно было узнать, где, что и сколько распределено?.. И из каких функций?..

Впрочем, это не важно (о мотивах создания).

Вопрос остается открытым - как вручную запустить конструктор?
PM MAIL   Вверх
nikitao
Дата 9.12.2005, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


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

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



Цитата(A @ 9.12.2005, 18:22)
Так-то оно так, но new и delete не гарантируют АВТОУНИЧТОЖЕНИЕ объектов!

А malloc что гарантирует smile smile smile smile

Это сообщение отредактировал(а) nikitao - 9.12.2005, 17:25


--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
Ignat
Дата 9.12.2005, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

Репутация: 3
Всего: 73



Цитата(nikitao @ 9.12.2005, 17:24)
А malloc что гарантирует

Нет smile


--------------------
Теперь при чем :P
PM   Вверх
nikitao
Дата 9.12.2005, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


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

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



Ignat,это риторический вопрос был smile

Это сообщение отредактировал(а) nikitao - 9.12.2005, 17:28


--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
A.V.N.
Дата 9.12.2005, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(nikitao @ 9.12.2005, 14:24)
А malloc что гарантирует smile smile smile smile

Нет.

Но это я использую в своей схеме управления памятью - см. тут.

И все-таки - кто-нибудь знает ответ на вопрос?
PM MAIL   Вверх
Neitron
Дата 9.12.2005, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 2
Всего: 5



Посмотри реализацию исходной new


--------------------
Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей.
Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ
PM MAIL   Вверх
A.V.N.
Дата 9.12.2005, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Neitron @ 9.12.2005, 15:07)
Посмотри реализацию исходной new

Интересно получается!

Код

;    A *a;
;    a = new A(5);
push        4    
call        operator new (41EF0Ah) 
add         esp,4 
mov         dword ptr [ebp-104h],eax 
cmp         dword ptr [ebp-104h],0 
je          WinMain+4Ch (425CECh) 
push        5    
mov         ecx,dword ptr [ebp-104h] 
call        A::A (41F199h)           ; вызывается конструктор, но НЕ ИЗ NEW !!!  :stena 


Т. е. выхов делается снаружи!

Кстати, для противников malloc() smile :

Код

void *__cdecl operator new(size_t size) _THROW1(_STD bad_alloc)
    {    // try to allocate size bytes
    void *p;
    while ((p = malloc(size)) == 0)
        if (_callnewh(size) == 0)
            _STD _Nomemory();
    return (p);
    }


Так что malloc используется, и вовсю!
Добавлено @ 18:28
Как ни странно, но вот такое:
Код

class A
{
    int b;
public:
    A(int c)
    {
        b = c;
    }
    ~A()    {}
};

A *a;
a->A(5);    // ошибка
a->~A();   // а так можно...


PM MAIL   Вверх
Ignat
Дата 9.12.2005, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

Репутация: 3
Всего: 73



Цитата(A @ 9.12.2005, 18:23)
Так что malloc используется, и вовсю!

А кто говорил, что он не используется?
Цитата(A @ 9.12.2005, 18:23)
вызывается конструктор, но НЕ ИЗ NEW !!!

Подожди, либо я туплю... Но судя по коду именно из new:
Код

cmp         dword ptr [ebp-104h],0    ; _callnewh(size) == 0
je          WinMain+4Ch (425CECh) ; _STD _Nomemory(); //Exeption

далее никакого ret.


--------------------
Теперь при чем :P
PM   Вверх
Void
Дата 9.12.2005, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



Цитата(A @ 9.12.2005, 19:22)
Вопрос остается открытым - как вручную запустить конструктор?

Столько флейма, и до сих пор не ответили? Ну вы даете, товарищи smile Placement new вас выручит:
Код

#include <new>

void *buff = your_advanced_allocation_function(sizeof(A));
A *a = new(buff) A;



--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
A.V.N.
Дата 12.12.2005, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Void @ 9.12.2005, 16:45)
Столько флейма, и до сих пор не ответили? Ну вы даете, товарищи smile


Да, меня это тоже удивило smile

Цитата(Void @ 9.12.2005, 16:45)

Placement new вас выручит:

#include <new>

void *buff = your_advanced_allocation_function(sizeof(A));
A *a = new(buff) A;


Я нашел более универсальный вариант:
Код

template <class T>
class Constructor
{
    T var;
  public:
    void *operator new (size_t size)  { return alloc(size); }
    void *operator new[] (size_t size)  { return alloc(size); }
    void operator delete (void *ptr) { return free (ptr); }
    void operator delete[] (void *ptr) { return free (ptr); }
};

class Foo { /* ... */ };

Foo *f = new Constructor<Foo>;



Работает как для встроенных, так и для пользовательских типов данных.

Это сообщение отредактировал(а) A.V.N. - 12.12.2005, 12:57
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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