Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Placement New


Автор: Xenon 28.12.2006, 03:34
Код

#include <iostream.h>
int main(int argc, char* argv[])
{
    int var=10;
    double* pTr=new double;
    new(pTr) int(var);
    delete pTr;
}


Если мы пытаемся в память, выделенную под double, запихнуть переменную типа int что происходит? Неявное преобразование или просто белеберда?

И чем в данном случае будет Type?
Код

template <class Type>
void Foo(Type* pTr,Type var)
{
    new (pTr) Type(var)
}
int main(int argc, char* argv[])
{
    int var=10;
    double* pTr=new double;
    Foo(pTr,var);
    cout << *pTr;
    delete pTr;

Автор: Daevaorn 28.12.2006, 09:09
Цитата(Xenon @  28.12.2006,  04:34 Найти цитируемый пост)
Если мы пытаемся в память, выделенную под double, запихнуть переменную типа int что происходит? Неявное преобразование или просто белеберда?

Не то и не другое. По данному адресу будет int.
Цитата(Xenon @  28.12.2006,  04:34 Найти цитируемый пост)
И чем в данном случае будет Type?

Ничем. Это не скомпилируется. Нужно явно указать тип при инстанцировании шаблона.

Автор: Xenon 28.12.2006, 13:58
Daevaorn, А почему тогда при попытке вывести содержимое, на которое указывает указатель, выводится какая-то хрень? smile

Автор: Daevaorn 28.12.2006, 20:42
Цитата(Xenon @  28.12.2006,  14:58 Найти цитируемый пост)
выводится какая-то хрень? 

потому что указатель свой тип не меняет при этом. вот и получается, что там лежит int, а ты разыменовываешь и поллучаешь значение узазателя на float

Автор: Xenon 28.12.2006, 22:33
Daevaorn, так а как мне получиться таким образом значение переменной реальное?
И если я таким образом в память под base попытаюсь засунуть derived класс, это урежется до base?

Автор: Daevaorn 28.12.2006, 22:40
Цитата(Xenon @  28.12.2006,  23:33 Найти цитируемый пост)
так а как мне получиться таким образом значение переменной реальное?

приведи указатель типу int*
Цитата(Xenon @  28.12.2006,  23:33 Найти цитируемый пост)
И если я таким образом в память под base попытаюсь засунуть derived класс, это урежется до base? 

Если конструктор Derived инициализирует поля данных, то ты убьешь память. Если нет, то есть шанс спастись. Но ничего не урежется, просто разыменовывание Base*, ты получишь Base, как и при полиморфном использовании.

Автор: JackYF 28.12.2006, 22:40
Код

....
int t = *(int*)(_floatPtr_);

Автор: Xenon 28.12.2006, 22:46
А если использовать C++ вариант приведения типов? Какой из cast надо использовать?
В ходе таких манипуляций (int сувать в double) я, естественно, теряю память?

Автор: Daevaorn 28.12.2006, 22:53
Цитата(Xenon @  28.12.2006,  23:46 Найти цитируемый пост)
А если использовать C++ вариант приведения типов? 

для указателей reinterpret_cast. Иногда static_cast
Цитата(Xenon @  28.12.2006,  23:46 Найти цитируемый пост)
В ходе таких манипуляций (int сувать в double) я, естественно, теряю память? 

placemant new не выделяет память, а только размещает(создает) объект по данному адресу. Поэтому память ты не потеряешь, только можешь испортить "не свою" память

Автор: Xenon 28.12.2006, 23:07
Daevaorn, я понимаю, что я помещаю, но я же ПОМЕЩАЮ объект меньшего размера в кусок памяти предназначеного для более большого оъекта?

Да я вот тоже пробовал static_cast - не прокатило. С чем это связано-то?

Автор: Daevaorn 28.12.2006, 23:11
Цитата(Xenon @  29.12.2006,  00:07 Найти цитируемый пост)
 но я же ПОМЕЩАЮ объект меньшего размера в кусок памяти предназначеного для более большого оъекта?

И что? Больше не меньше. Просто кусок будет не задействан.

Автор: Xenon 28.12.2006, 23:17
Daevaorn, что и я хотел узнать smile понятно.

Автор: Daevaorn 28.12.2006, 23:23
Цитата(Xenon @  29.12.2006,  00:07 Найти цитируемый пост)
Да я вот тоже пробовал static_cast - не прокатило. С чем это связано-то? 

Код

    int* a;
    float* b;
    void* c;

    c = a; // ok
    a = c; // error
    a = static_cast< int* >( c ); // ok
    a = b; // error
    a = reinterpret_cast< int* >( b ); // ok

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)