Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Я не уверен, что это тот самый вариант. В данном случае создаётся временная переменная (естественно для неё вызывается конструктор), потом вызывается конструктор копирования.
Если нам не помогут, то мы тоже никого не пощадим.
Как мне когда-то Тарасевич объяснял, создание (семантика содания) временного объекта не есть вызов конструктора. К тому же нет никакого смысла получать адрес временного объекта, т.к. сразу же после интсрукции
Dummy *t = &(Dummy::Dummy(2));
он будет уничтожен. Я не знаток стандарта, но то, что VC 6.0 это компилирует, не означает, что можно так писать. Точно знаю, что VC 6.0 позволяет инициализировать не константные ссылки временными объектами. Типа:
Здравствуйте, RmzVoid, Вы писали:
А>>он будет уничтожен. <Я не знаток стандарта>
RV>А вот и не будет! в дебаггере смотрел!
Во-первых — будет. Будет уничтожен в конце вычисления выражения. Невнимательно, значит, смотрел.
Во-вторых, как тут уже не раз говорилось, применение встроенного унарного оператора '&' (взятие адреса) ко временному объекту в С++ запрещено.
*>n = new(&Pool) node; — все работает
*>delete (n, &Pool): — вызывает стандартный delete из CRT !!!
*>В ЧЕМ МОЖЕТ БЫТЬ ПРОБЛЕМА????
placement delete вызывается только при исключении, выброшенном при выполнении placement new (во всяком случае, стандарт говорит о таком применении). Непосредственно вызвать placement delete нельзя, хотя определить можно. Соответственно, синтаксиса для placement delete — нету.
В данном случае delete (n, &Pool) фактически пытается удалить Pool, трактуя (n,&Pool) как выражение, значением которого является вполне законный аргумент оператора delete, т.е., &Pool.
На самом деле, тебе нужно определить ещё один оператор delete в структуре node:
struct node {
...
void operator delete(void *ptr)
{
// здесь нужно найти тот Pool, который содержит ptr и ему уже передать ptr для обработки
}
...
};
// Собственно, использование:
n = new(&Pool) node;
delete n; // Здесь вызовется node::delete
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Андрей Тарасевич, Вы писали:
АТ>Во-первых — будет. Будет уничтожен в конце вычисления выражения. Невнимательно, значит, смотрел. АТ>Во-вторых, как тут уже не раз говорилось, применение встроенного унарного оператора '&' (взятие адреса) ко временному объекту в С++ запрещено.
Компилятор не ругается! Запрещено возвращение адреса локальной переменной.
А указатель в моем примере будет верен до выхода из блока.
В данном случае функции мэйн...
Здравствуйте, RmzVoid, Вы писали:
АТ>>Во-первых — будет. Будет уничтожен в конце вычисления выражения. Невнимательно, значит, смотрел. АТ>>Во-вторых, как тут уже не раз говорилось, применение встроенного унарного оператора '&' (взятие адреса) ко временному объекту в С++ запрещено.
RV>Компилятор не ругается!
Вот такой у тебя кривой компилятор.
RV>Запрещено возвращение адреса локальной переменной.
Нет, возвращение адреса локальной переменной на уровне диагностики компилятора как раз таки не запрещено. Это, разумеется, не корректно, но в общем случае и не детектируемо на стадии компиляции. В любом случае, у данному вопросу это не относится.
RV>А указатель в моем примере будет верен до выхода из блока.
Нет. То, что ты говоришь, похоже на правило продления жизни временного объекта при привязке к нему константной ссылки. Но это из несколько иной оперы, а для нашего случая еще раз повторяю: применение встроенного унарного оператора '&' (взятие адреса) ко временному объекту в С++ запрещено. Временные объекты не являются Lvalue, а встроенный унарный оператор '&', по определению, применим только к Lvalue.
Компилятор MSVC++ 6, например, позволяет применять '&' к временным объектам. Но о продении времени жизни объекта до конца блока он при этом не заботится. Объект уничтожается в конце вычисления полного выражения, а указатель остается "подвешенным". В любом случае — это довольно бесполезная вольность MSVC++ 6, никакого отношения к С++ не имеющая.
Окей! Убедил
Все равно мне параллельно пока на эти вещи, таким углубленным С++
я не занимался, только в книжках читал. Да я думаю мне навряд ли
придется использовать такие тонкости.
Здравствуйте, RmzVoid, Вы писали:
RV>Здравствуйте, Андрей Тарасевич:
RV>Окей! Убедил :)) RV>Все равно мне параллельно пока на эти вещи, таким углубленным С++ RV>я не занимался, только в книжках читал. Да я думаю мне навряд ли RV>придется использовать такие тонкости.
Вот словишь access violation или segmentation fault при очередно взятии адреса временой переменной — придется в книжки лезть...
Здравствуйте, jazzer, Вы писали:
J>Вот словишь access violation или segmentation fault при очередно взятии адреса временой переменной — придется в книжки лезть...
J>Лучше сейчас С++ учи