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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Placement New, ... вопрос 
:(
    Опции темы
Xenon
Дата 28.12.2006, 03:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Код

#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;


Это сообщение отредактировал(а) Xenon - 28.12.2006, 03:38


--------------------
user posted image  
PM MAIL   Вверх
Daevaorn
Дата 28.12.2006, 09:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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

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

Ничем. Это не скомпилируется. Нужно явно указать тип при инстанцировании шаблона.
PM MAIL WWW   Вверх
Xenon
Дата 28.12.2006, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



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


--------------------
user posted image  
PM MAIL   Вверх
Daevaorn
Дата 28.12.2006, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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

потому что указатель свой тип не меняет при этом. вот и получается, что там лежит int, а ты разыменовываешь и поллучаешь значение узазателя на float
PM MAIL WWW   Вверх
Xenon
Дата 28.12.2006, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



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


--------------------
user posted image  
PM MAIL   Вверх
Daevaorn
Дата 28.12.2006, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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

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

Если конструктор Derived инициализирует поля данных, то ты убьешь память. Если нет, то есть шанс спастись. Но ничего не урежется, просто разыменовывание Base*, ты получишь Base, как и при полиморфном использовании.
PM MAIL WWW   Вверх
JackYF
Дата 28.12.2006, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Код

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



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Xenon
Дата 28.12.2006, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



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


--------------------
user posted image  
PM MAIL   Вверх
Daevaorn
Дата 28.12.2006, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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

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

placemant new не выделяет память, а только размещает(создает) объект по данному адресу. Поэтому память ты не потеряешь, только можешь испортить "не свою" память
PM MAIL WWW   Вверх
Xenon
Дата 28.12.2006, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



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

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


--------------------
user posted image  
PM MAIL   Вверх
Daevaorn
Дата 28.12.2006, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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

И что? Больше не меньше. Просто кусок будет не задействан.
PM MAIL WWW   Вверх
Xenon
Дата 28.12.2006, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Daevaorn, что и я хотел узнать smile понятно.


--------------------
user posted image  
PM MAIL   Вверх
Daevaorn
Дата 28.12.2006, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(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

PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.1284 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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