- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
template<class T>
class smartest_ptr
{
std::unique_ptr<T> m_p;
std::array<char, sizeof(T)> m_data; // массив размером с объект
public:
void New() {m_p = new(&m_data) T();}
operator ->() {return m_p;}
};
// никакого выделения памяти из кучи!
smartest_ptr<CFoo> pFoo; // типа nullptr
// pFoo->Method(); - нельзя, nullptr
pFoo.New();
pFoo->FooMethod();
pFoo->AnotherMeth();
LispGovno 26.01.2014 02:01 # +7
О мудрейший и могущественнейший из указателей!
chtulhu 26.01.2014 06:19 # +2
разве так можно? У unique_ptr выпили же operator =
bormand 26.01.2014 07:18 # +3
P.S. А ведь unique_ptr потом сделает этому буферу delete... И кровь-кишки-распидорасило...
LispGovno 26.01.2014 11:31 # +1
Я подозреваю, что это концепт, который спасёт мир от медленых аллокаций памяти в крестах
bormand 26.01.2014 06:48 # +3
- Это же заумный указатель! Ты ничего не понимаешь в крестах, нуб!
bormand 26.01.2014 06:59 # +1
bormand 26.01.2014 08:02 # +2
LispGovno 26.01.2014 11:34 # +2
На фоне мудрейшего указателя
> smartester_ptr
уникью_птр смотрится как тупой.
Dr_Offset 28.01.2014 12:07 # 0
bormand 28.01.2014 12:47 # 0
Ниже chtulhu написал вариант без std::unique_ptr.
chtulhu 26.01.2014 08:06 # +1
bormand 26.01.2014 08:21 # 0
LispGovno 26.01.2014 11:37 # 0
WGH 26.01.2014 14:18 # +3
Abbath 26.01.2014 16:54 # +3
roman-kashitsyn 26.01.2014 17:27 # +3
bormand 26.01.2014 17:30 # +1
Abbath 26.01.2014 17:32 # +2
LispGovno 26.01.2014 19:18 # +1
bormand 26.01.2014 19:30 # +3
3.14159265 26.01.2014 20:29 # +3
LispGovno 26.01.2014 19:31 # 0
TarasB 26.01.2014 17:33 # +6
3.14159265 26.01.2014 17:56 # +5
Зачем оно надо?
Какую проблему решает?
Нихера не пойму.
Целый крестофорум наркоманов дни напролёт только тем и занимается что придумывает какие-то замысловатые конструкции ебанутее прежних...
bormand 26.01.2014 18:06 # +2
Решение: запилить на стеке место под объект, и отложить инициализацию до вызова New().
chtulhu 27.01.2014 05:38 # +5
наличие свободного времени :)
LispGovno 27.01.2014 08:23 # +1
bormand 27.01.2014 09:50 # +1
LispGovno 27.01.2014 10:34 # +3
в нем сочетается одновременно любовь к написанию велосипедов и не умение их писать.
LispGovno 27.01.2014 10:39 # +3
defecate-plusplus 27.01.2014 10:45 # +3
LispGovno 27.01.2014 10:51 # 0
chtulhu 27.01.2014 13:13 # 0
а чем им не угодили rvalue semantics? Это же чистый перфоманс
TarasB 27.01.2014 13:19 # 0
Для чистого перфоманса исходный объект надо нафиг забывать. А в кривтах исходный объект надо приводить к состоянию, из которого можно безопасно вызвать dtor.
bormand 27.01.2014 13:53 # 0
Или есть другие пути?
TarasB 27.01.2014 14:06 # 0
Это например возврат значения из функции.
Не путать с std::move! std::move разрешается применять к объекту посреди его жизненного цикла, а тот move, про который я думаю - он только для конца жизненного цикла. То есть любой объект в конце жизни должен быть либо уничтожен, либо перемещён.
> Придется какой-то флаг хранить, что черезголова по памяти.
Да, именно это текущая система и предлагает! Любой объект обязан хранить флаг "не занулён ли", в перемещателе я должен занулять флаг, а в деструкторе проверять флаг на зануление.
В моей схеме флаг не нужен. Если объект переместили, то к нему после этого обращаться тупо запрещено, если только не ССЗБ. Это как с ручным вызовом конструктора в нынешней схеме.
LispGovno 27.01.2014 14:12 # 0
TarasB 27.01.2014 14:20 # +2
По делу мы с тобой вроде всё на крестофоруме обсудили.
LispGovno 27.01.2014 14:25 # +4
predicate
LispGovno 27.01.2014 14:27 # +1
TarasB 27.01.2014 14:50 # 0
chtulhu 27.01.2014 15:36 # 0
Сначала перемещение его обнулит, а потом он будет уничтожен.
>Да, именно это текущая система и предлагает! Любой объект обязан хранить флаг "не занулён ли", в перемещателе я должен занулять флаг, а в деструкторе проверять флаг на зануление.
При создании объектов хорошим тоном будет предоставить конструктор без параметров, который не будет захватывать ресурс, и методы для инициализации и освобождения ресурсов. В деструкторе, естественно, происходит освобождение, если есть что освобождать. Таким образом, объект обязан хранить информацию о том, захватил ли он ресурс. Хоть флаг, хоть специальное значение(nullptr, -1, INVALID_HANDLE итп)
>Если объект переместили, то к нему после этого обращаться тупо запрещено, если только не ССЗБ.
объект остаётся на месте, а его ресурсы переходят к другому объекту и теперь этот другой отвечает за их освобождение
TarasB 27.01.2014 15:57 # 0
Так это и есть переголова!
Почему нельзя просто нихера с ним не делать?
> При создании объектов хорошим тоном будет предоставить конструктор без параметров, который не будет захватывать ресурс
А если я хочу блин такой объект, который не может иметь нулевое состояние? То текущая схема не даст мне его создать.
Да и даже если допустить нулевое состояние - то в текущей схеме имеем переголову на то, чтобы занулять объект, а потом проверять, не занулили ли его.
> объект остаётся на месте, а его ресурсы переходят к другому объекту и теперь этот другой отвечает за их освобождение
Я знаю. Если ресурсы объекта перешли другому и сам объект уходит из зоны видимости, то не лучше ли тупо забыть про него?
chtulhu 27.01.2014 16:36 # 0
БАЙТОЁБСТВО
>Почему нельзя просто нихера с ним не делать?
то есть вместо оперции перемещения и деструктора надо запилить операцию перемещения при выходе из фукнции, перемещения с помощью std::move итд?
Вместо того, что разбить сложные операции на примитивы будем реализововать конкретный каждый случай?
Как в твоей схеме будет работать такая ситуация?
>А если я хочу блин такой объект, который не может иметь нулевое состояние? То текущая схема не даст мне его создать.
Такое может иметь смысл, если объект живет на стэке и является чем-то вроде mutex_locker
>Да и даже если допустить нулевое состояние - то в текущей схеме имеем переголову на то, чтобы занулять объект, а потом проверять, не занулили ли его.
Maybe boost::option или наиумнейший указатель из соседнего треда
>Я знаю. Если ресурсы объекта перешли другому и сам объект уходит из зоны видимости, то не лучше ли тупо забыть про него?
Про целостность(как языка, так и объекта) тоже лучше забыть?
TarasB 27.01.2014 17:14 # 0
Ручной вызов моего move - это операция, которую могут делать лишь те, кто отвечает за последствия, как и ручной вызов конструктора, деструктора итд.
3.14159265 18.02.2014 02:13 # +3
Ничё скоро начнут юзать - за уши не оттянешь. Оно так всегда с достижениями прогресса.
PS
>>не умение их писать
>>не состоятельностью
>>без оговорочно
Простите, но всё это пишется слитно.
bormand 27.01.2014 10:51 # +8
Сниму порчу с памяти, верну потерянные указатели, найду забытые деструкторы. Гадание на gdb в присутствии заказчика или по снимку памяти. Дорого.