.[ ČeskéHry.cz ].
Segmentation fault v Linuxu
Jdi na stránku Předchozí  1, 2, 3  Další
 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> C / C++
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
TeaTime



Založen: 17. 06. 2011
Příspěvky: 264

PříspěvekZaslal: 20. srpen 2013, 18:04:57    Předmět: Odpovědět s citátem

VODA napsal:
Obvykle se to nenuluje, což vychází z assembleru.


No existuje spousta možností, jak tu paměť nulovat tak, aby to nebylo z assembleru vidět, ale já neříkám, že se to soustavně vždy nuluje, jen si myslím, že když naalokuješ paměť, tak je prostě dost často nulová.


Tak jsem to kvůli tobě otestoval. Platforma je Gentoo GNU/Linux.

program:
kód:
#include <iostream>
using namespace std;

int main()
{
   {
      cout << "--------------------STATIC ALLOCATION--------------------" << endl;
      int a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r;
      cout << a << endl;
      cout << b << endl;
      cout << c << endl;
      cout << d << endl;
      cout << e << endl;
      cout << f << endl;
      cout << g << endl;
      cout << h << endl;
      cout << i << endl;
      cout << j << endl;
      cout << k << endl;
      cout << l << endl;
      cout << m << endl;
      cout << n << endl;
      cout << o << endl;
      cout << p << endl;
      cout << q << endl;
      cout << r << endl;
   }
   {
      cout << "--------------------DYNAMIC ALLOCATION--------------------" << endl;
      int * a = new int;
      int * b = new int;
      int * c = new int;
      int * d = new int;
      int * e = new int;
      int * f = new int;
      int * g = new int;
      int * h = new int;
      int * i = new int;
      int * j = new int;
      int * k = new int;
      int * l = new int;
      int * m = new int;
      int * n = new int;
      int * o = new int;
      int * p = new int;
      int * q = new int;
      int * r = new int;
      
      cout << (*a) << endl;
      cout << (*b) << endl;
      cout << (*c) << endl;
      cout << (*d) << endl;
      cout << (*e) << endl;
      cout << (*f) << endl;
      cout << (*g) << endl;
      cout << (*h) << endl;
      cout << (*i) << endl;
      cout << (*j) << endl;
      cout << (*k) << endl;
      cout << (*l) << endl;
      cout << (*m) << endl;
      cout << (*n) << endl;
      cout << (*o) << endl;
      cout << (*p) << endl;
      cout << (*q) << endl;
      cout << (*r) << endl;
   }
   
}


překlad:
kód:
g++ main.cpp


výstup:
kód:
--------------------STATIC ALLOCATION--------------------
0
0
32767
320187552
0
4196480
0
4198256
0
0
0
1
0
4198349
0
2
0
4198250
--------------------DYNAMIC ALLOCATION--------------------
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0


Jak je to na Win nebo na VS nevím, ale VS to fakt možná nuluje.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 20. srpen 2013, 18:19:14    Předmět: Odpovědět s citátem

Pokud se to udělá takhle:

kód:
int *array = new int[50];


může být v paměti bordel

ALE takhle

kód:
int *array = new int[50]();


to vynuluje
_________________
Perry.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
TeaTime



Založen: 17. 06. 2011
Příspěvky: 264

PříspěvekZaslal: 20. srpen 2013, 18:26:47    Předmět: Odpovědět s citátem

perry napsal:

ALE takhle

kód:
int *array = new int[50]();


to vynuluje


Jasný, zavolá to totiž konstruktor, že? To jsou ale kouzla Shocked .
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 20. srpen 2013, 18:29:55    Předmět: Odpovědět s citátem

citace:
TeaTime
Jasný, zavolá to totiž konstruktor, že? To jsou ale kouzla Shocked .


No.. jasný to je ale nikdy jsem to nepoužil a ani moc často neviděl Wink
_________________
Perry.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
satik



Založen: 06. 05. 2010
Příspěvky: 161
Bydliště: Krkonose

PříspěvekZaslal: 20. srpen 2013, 20:33:51    Předmět: Odpovědět s citátem

Není to ovlivněno debug/release?
Mám pocit, že VS v debug módu nuluje a v release ne.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Tringi



Založen: 28. 07. 2007
Příspěvky: 290

PříspěvekZaslal: 20. srpen 2013, 21:27:50    Předmět: Odpovědět s citátem

A pak tady máte takové MinGW a Cygwin, které vnáší mix mezi linuxovou sémantikou a Visual Studia v tomto ohledu. Resp. MinGW takový debug režim, kdy by přednulovával stack-framy, nemá.

Standard C++ garantuje, že automaticky vynulované budou pouze statické (uvnitř funkcí), thread-local a, možná překvapivě (a občas kompilátory implementováno špatně), globální proměnné; stack ne.
To, že Windows (a vlastně každý OS, který slibuje trochu normální zabezpečení) přiřazuje procesům nové stránky vždy vynulované, nebrání zavaděči vláken použít pro stack takové, které už od VM má, popsané, případně že funkce vstoupí (nejčastější případ) na stack, kde už před ní nějaká funkce byla, a tu paměť k něčemu používala.
_________________
WWW | GitHub | TW


Naposledy upravil Tringi dne 20. srpen 2013, 21:29:39, celkově upraveno 1 krát
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
nou



Založen: 28. 07. 2007
Příspěvky: 1047

PříspěvekZaslal: 20. srpen 2013, 21:29:16    Předmět: Odpovědět s citátem

no new A(); vs new A; je setsakra okrajovy problem pricom zalezi ci kompulujete ako C++98 alebo C++03 http://stackoverflow.com/questions/620137/do-the-parentheses-after-the-type-name-make-a-difference-with-new

tyka sa to ale iba Plain Old Data, teda primityvnych typov a struct/class bez konstruktora, destruktora alebo virtualnych metod.

mam pre vas jednu chutovku
kód:

class A{ int a; };
class B{ int b; public: virtual ~B(){} };
class C : public A, public B{ int c; };

A *a = new C;
delete a;//crash

_________________
Najjednoduchšie chyby sa najtažšie hľadajú.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
mar



Založen: 16. 06. 2012
Příspěvky: 608

PříspěvekZaslal: 20. srpen 2013, 22:05:51    Předmět: Odpovědět s citátem

No tak to je zajímavé. Já jsem zvyklý nepoužívat závorky u konstruktoru new a doteď jsem si myslel, že je to ekvivalentní zápis... toto je pro mě novinka (nejsem standard nazi).
Díky (nicméně počítat s tím nikdy nebudu Smile
Na multiple inheritance mám svůj názor (=prasárna), buď se to používá pro slepení unrelated tříd nebo to používají Javisti (nebo C# kluci), co si myslí, že interfacy jsou c00l.
Mimochodem kontrolní otázka: pointer to member v MSC má konstantní (jak si přeje standard) nebo dynamickou velikost? Wink
Btw. je pravda, že dynamic cast je brutálně neoptimální? (jsem líný otestovat) Žil jsem doteď v omylu, že pro classu porovná s class deskriptorem (=pointer někam), ale prý se tam u některých překladačů porovnávají stringy (FUJ!).
Mě to tedy netrápí, mám vlastní obdobu RTTI se striktní single inheritance,
což mi umožnuje spawnování podle názvu třídy a serializaci členských proměnných...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
satik



Založen: 06. 05. 2010
Příspěvky: 161
Bydliště: Krkonose

PříspěvekZaslal: 20. srpen 2013, 22:15:30    Předmět: Odpovědět s citátem

mar napsal:
Na multiple inheritance mám svůj názor (=prasárna), buď se to používá pro slepení unrelated tříd nebo to používají Javisti (nebo C# kluci), co si myslí, že interfacy jsou c00l.


C# nemá multiple inheritance, resp ne na třídy.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
mar



Založen: 16. 06. 2012
Příspěvky: 608

PříspěvekZaslal: 20. srpen 2013, 22:21:28    Předmět: Odpovědět s citátem

satik napsal:
C# nemá multiple inheritance.

A co jsou interfacy potom?
EDIT: obecně si myslím, že algoritmická kvalita je mnohdy důležitější, než fancy prasárny toho či onoho jazyka proto, že si někdo myslí, že je to velmi cool.
Mám rád jednoduché věci, i když ne vždy se mi to úplně daří.
(=vždycky radši použiji high level algoritmus s nižší časovou složitostí, než se babrat v low level nesmyslech)
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Vilem Otte



Založen: 18. 09. 2007
Příspěvky: 462
Bydliště: Znojmo - Sedlesovice, Kravi Hora

PříspěvekZaslal: 21. srpen 2013, 00:57:26    Předmět: Odpovědět s citátem

citace:
Mám rád jednoduché věci, i když ne vždy se mi to úplně daří.
(=vždycky radši použiji high level algoritmus s nižší časovou složitostí, než se babrat v low level nesmyslech)

High level algoritmus s nižší časovou složitostí než co? Jestli než low level "nesmysly" tak mi uveď nějaký příklad, chtěl bych ho vidět.
_________________
Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail Zobrazit autorovi WWW stránky
mar



Založen: 16. 06. 2012
Příspěvky: 608

PříspěvekZaslal: 21. srpen 2013, 08:08:48    Předmět: Odpovědět s citátem

Asi jsem špatně vyjádřil. Pokud mám někde např. O(n^2), kde n je docela vysoké (a můžu mít třeba n*log n), tak asi logicky nezačnu s low level optimalizacemi, abych to zrychlil (protože to mě nevytrhne, i kdybych to řekněme zrychlil 4x).
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
vitamin



Založen: 31. 07. 2013
Příspěvky: 7

PříspěvekZaslal: 21. srpen 2013, 09:30:03    Předmět: Odpovědět s citátem

mar napsal:

...
Btw. je pravda, že dynamic cast je brutálně neoptimální? (jsem líný otestovat) Žil jsem doteď v omylu, že pro classu porovná s class deskriptorem (=pointer někam), ale prý se tam u některých překladačů porovnávají stringy (FUJ!).
Mě to tedy netrápí, mám vlastní obdobu RTTI se striktní single inheritance,
což mi umožnuje spawnování podle názvu třídy a serializaci členských proměnných...

Ak mas extremne zastarali prekladac tak sa mozu porovnavat stringy. Standart nepise ako sa ma implementovat dynamic_cast, ale vecsina prekladacov to ma tak ze tabulka virtualnych metod obsahuje pointer na data obsahujuce RTTI. Dynamic_cast je ale aj tak pomaly, testuje nullptr, obsahuje viacej dereferenovani, vola specialnu funkciu ktora testuje hiearchiu objektov...
Ked uz treba casto pouzivat dynamic_cast tak je dobre si implementovat vlastnu verziu. Ja pouzivam isa/classof/dyn_cast z llvm (Tiez len so single inheritance)

nou napsal:

...
mam pre vas jednu chutovku
kód:

class A{ int a; };
class B{ int b; public: virtual ~B(){} };
class C : public A, public B{ int c; };

A *a = new C;
delete a;//crash



Mne to v pohode funguje (az na to ze sa nevola destructor ~C a ~B kvoly absencii vptr v A)
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
quas4



Založen: 18. 10. 2007
Příspěvky: 199

PříspěvekZaslal: 21. srpen 2013, 09:49:42    Předmět: Odpovědět s citátem

valgrind je fajn ale na tohle je snazsi pridat kompilatoru -g a spustit pod gdb (gdb --args ./muj-program args) a pri padu se podivat na backtrace pripadne na promenne.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Lemik



Založen: 30. 07. 2007
Příspěvky: 138

PříspěvekZaslal: 21. srpen 2013, 19:31:53    Předmět: Odpovědět s citátem

nou napsal:

mam pre vas jednu chutovku
kód:

class A{ int a; };
class B{ int b; public: virtual ~B(){} };
class C : public A, public B{ int c; };

A *a = new C;
delete a;//crash


GCC podporující -Weffc++ Tě upozorní
citace:
warning: base class 'class A' has a non-virtual destructor [-Weffc++]


No a pokud používáš C++11 tak používat override:
kód:
class B
{
public:
    virtual ~B() override
    {}

private:
    int b = 0;
};


a překladač hned hodí chybu
citace:
error: 'virtual B::~B()' marked override, but does not override
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> C / C++ Časy uváděny v GMT + 1 hodina
Jdi na stránku Předchozí  1, 2, 3  Další
Strana 2 z 3

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna