-
Список говнокодов пользователя LispGovno
Всего: 223
-
+16
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
#include <iostream>
using namespace std;
struct T{int a;T(){cout<<"T"<<this<<endl;}~T(){cout<<"~T"<<this<<endl;}};
struct D:public T{int b;D(){cout<<"D"<<this<<endl;}~D(){cout<<"~D"<<this<<endl;}};
int main() {
T* a = new D[2];
cout<<"mission failure"<<endl;
delete[] a;
return 0;
}
Писал тест специально для Тараса:
Виртуальный деструктор в базовых классах нужен:
*Для вызова деструкторов всех потомков. Иногда это не нужно, тк поля структуры тривиальны. Согласен с Тарасом.
*Для правильного выбора перегруженного оператора delete. Создал одним менеджером памяти, а удалил в другой - это плохо. Но также бывает редко и только в специфичных проектах.
Но вот то, что демонстрируется в этом примере - думаю чего-нибудь такого создатели той библиотеки, что ковырял Тарас, и опасались.
Не просто было вызван деструктор только для предков, забыв о деструкторах потомков, но и:
*Деструктор предков был вызван для this не по тем адресам, где расположены объекты.
Не удивлюсь, если:
*В некоторых кулхацкерских реализациях менеджеров памяти будет удален буфер меньшего размера и куча попортится или оставшаяся не удаленная часть массива в куче просто утекет.
http://liveworkspace.org/code/2X3MR0$8
LispGovno,
22 Декабря 2012
-
+132
- 1
public virtual int ReadByte()
Тут в соседнем треде появилась такая тема:
http://msdn.microsoft.com/ru-ru/library/system.io.stream.readbyte.aspx
http://govnokod.ru/12311#comment164854
LispGovno,
20 Декабря 2012
-
+13
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
#include <iostream>
using namespace std;
class Manager
{
private:
int *ar;
int _size;
public:
void CreateArray(int size);
void ResizeArray(int size);
void MakeIntArray(int iter, int number);
int GetIntArray(int iter);
~Manager()
{
delete [] ar;
}
};
void Manager::CreateArray(int size)
{
_size = size;
ar = new int[size];
}
void Manager::ResizeArray(int size)
{
int *nar = new int[size];
for(int i = 0; i < _size; i++)
{
*(nar+i) = *(ar+i);
}
_size = size;
delete [] ar;
*ar = *nar;
}
int Manager::GetIntArray(int iter)
{
return iter < _size ? *(ar+iter) : NULL;
}
void Manager::MakeIntArray(int iter, int number)
{
if(iter < _size)
*(ar+iter) = number;
}
int main()
{
Manager Man;
Man.CreateArray(10);
for(int i = 0; i < 10; i++)
Man.MakeIntArray(i, i);
for(int i = 0; i < 10; i++)
cout << Man.GetIntArray(i) << " ";
Man.ResizeArray(20);
cout << endl;
for(int i = 10; i < 20; i++)
Man.MakeIntArray(i, i);
for(int i = 0; i < 20; i++)
cout << Man.GetIntArray(i) << " ";
return 0;
}
> Собственно написал менеджер для массива, хочется узнать правильно ли все сделано, и нет ли утечек памяти?
Очередной шедевр с самизнаетеоткуда.
LispGovno,
12 Декабря 2012
-
+15
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
LambdaVar<1> X;
LambdaVar<2> Y;
// The next line prints 10:
cout << lambda(X,Y)[ plus[ multiplies[3,X], Y ] ] (3,1) << endl;
cout << lambda(X,Y)[ (3 %multiplies% X) %plus% Y ] << endl;
//...
lambda(X)[ X %plus% getCurrentTime[_*_] ]
//...
let[ X == someLambdaExp,
Y == someOtherLambdaExpWhichMayInvolveX ]
.in[ someLambdaExpInvolvingXandY ]
//...
lambda(X)[
letrec[ F == lambda(Y)[ if1[ Y %equals% 0,
1,
Y %multiplies% F[Y %minus% 1] ] ] ]
.in[ F[X] ] ]
//...
Maybe<int> mx = just(2);
Maybe<int> my = just(3);
mx = lambda()[ compM<MaybeM>()[ plus[X,Y] | X<=mx, Y<=my, guard[false] ] ]();
cout << mx << endl; // Nothing
//...
compM<ListM>()[ makePair[X,Y] | X<=list_with(1,2), guard[true],
Y<=list_with(3,4), guard[ (Y %divides% X) %equal% 3 ] ] ]
Грибки отсюда:
http://people.cs.umass.edu/~yannis/fc++/
LispGovno,
10 Декабря 2012
-
+12
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
#include <iostream>
#include <functional>
using namespace std;
struct T
{
int a;
T(const T&):a(1){cout<<"copy_construct T"<<endl;}
T():a(1){cout<<"construct T"<<endl;}
~T(){a=0;cout<<"destruct T"<<endl;}
const T& operator=(const T&){cout<<"copy_ass T"<<endl;return *this;}
};
struct M: public T{};
void f(const T& fa)
{
cout<<"fa.a= "<<fa.a<<endl;
}
int main() {
f(std::cref(T()));
cout<<endl;
const T& b = T();
cout<<"b.a= "<<b.a<<endl;
cout<<endl;
const T& a = std::cref(T());
cout<<"a.a= "<<a.a<<endl;
return 0;
}
http://ideone.com/BmHo9w
Есть на этом ресурсе великий знаватель крестов и вот он меня уверял, что объект, на который ссылается ссылка - должен дожить до конца выхода ссылки из скоупа. Почему мы этого не наблюдаем? А знаватель? Ты меня прямо даже убедил, и тут такая подстава от тебя. a - не дожил до конца.
LispGovno,
03 Декабря 2012
-
+2
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
template <typename A, typename B>
class ololo
{
};
template <typename A>
class ololo <A, int>
{
};
template <typename A>
void bububu ()
{
}
template <>
void bububu <int> ()
{
}
template <typename A, typename B>
void kokoko ()
{
}
template <typename A>
void kokoko <A, int> ()
{
}
http://www.gamedev.ru/flame/forum/?id=169781
tarasboproblemi
LispGovno,
29 Ноября 2012
-
+12
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
#include <stdio.h>
#include <type_traits>
#include <string>
struct hack_t{};
template<class TYPE>static hack_t operator&(const TYPE&,hack_t){return hack_t();}
int main()
{
struct type{};
std::string var="win";
#define get_meta(var)[&]()->bool{hack_t unnamed;hack_t foo(var&unnamed);return std::is_function<decltype(foo)>::value;}()
bool result_0=get_meta(var);
bool result_1=get_meta(type);
#undef get_meta
printf("get_meta(var) == %s\n",result_0?"true":"false");
printf("get_meta(type) == %s\n",result_1?"true":"false");
return 0;
}
Код отличает переменную от типа.
http://ideone.com/t7BBO4
Сами знаете откуда.
LispGovno,
27 Ноября 2012
-
+10
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
//В mathc.hpp:
typedef float import (float);
//В неком cpp функция:
float cm() {
import calcFpu;
//...
float src = //...
float res = calcFpu(src);
return res;
}
//В mathc.cpp:
void calcFpu(float){
//...
void calcSSE(float){
//...
Мои глаза... В перлы.
http://ideone.com/RBAMyv
LispGovno,
27 Ноября 2012
-
+15
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
#include <iostream>
#include <functional>
template<class Container, class F, class A>
auto accumulate(Container c, F f, A acc) -> A
{
auto id = [](const A& a) -> const A& {return a;};
typedef decltype(std::begin(c)) Iterator;
const std::function<A(const Iterator& lst, const std::function<A(const A&)>&)> doIt =
[&](const Iterator& lst, const std::function<A(const A&)>& cont) -> A
{
if(lst==c.end())
return cont(acc);
else
{
auto conter=[&](const A& acc) -> A {return cont(f(*lst, acc));};
return doIt(lst+1, conter);
}
};
return doIt(std::begin(c), id);
}
int main() {
std::cout<<accumulate({1,2,3,4}, std::plus<int>(), 0);
return 0;
}
Похоже написал какой-то монадолог.
http://ideone.com/y4Dm9z
Пример использования accumulate сам накатал.
Я побаловался с этим примером, чтобы разобраться и GCC ожидаемо упал:
http://ideone.com/XWfuoP
Я убежден, что эта функция должна была выглядеть как-то так:
template<class Container, class F>
accumulate(const Container& c, const F& f=std::plus<decltype(*(std::begin(c)))>(), const decltype(*(std::begin(c))) acc=decltype(*(std::begin(c)))()) -> decltype(*(std::begin(c)))
{
return std::accumulate(c.begin(), c.end(), acc, f);
}
//Вызов этой функции:
accumulate({1,2,3,4});
Ну и я погуглил на тему этого говнокода и нашел на функциональном языке похожий:
let fold_right func acc list =
let rec loop list cont = //сюда мы передаем текущую функцию континуации
match list with
|[] -> cont acc //а вот и наше ключевое вычисление.
|head::tail -> loop tail (fun racc -> cont (func head racc))
loop list (fun x -> x)
LispGovno,
23 Ноября 2012
-
+23
- 1
- 2
typedef const AbstractParameter ConstAbstractParameter;
class Parameter: public ConstAbstractParameter{
GCC это не компилирует, но в 2008 ms vs компилируется без предупреждений. Я это как увидел, так сразу переписал на
class Parameter: public AbstractParameter{
А вот теперь я дома и не могу заснуть. Гложет чувство, что я поступил не правильно. Такое чувство как-будто этот const, пусть и не в рамках стандарта С++, но что-то он делал.
LispGovno,
20 Ноября 2012