Dynamická alokace uvnitř funkce – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Dynamická alokace uvnitř funkce – C / C++ – Fórum – Programujte.comDynamická alokace uvnitř funkce – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
An00biS
~ Anonymní uživatel
4 příspěvky
19. 8. 2007   #1
-
0
-

Prosím o radu. Chtěl bych dynamicky alokovat třídu uvnitř funkce a pak ji používat po skončení této funkce. Jenže se mi to nedaří. Podívejte se prosím na kód, který posílám a napište mi, co dělám špatně. Předem díky.



#include <iostream>
using namespace std;

class testovaci{
public:
int a,b;
testovaci(){ cout<<"Konstruktor proveden\n"; }
~testovaci(){ cout<<"Destruktor proveden\n"; }
};

int alokovat(testovaci *t){
t = new testovaci;
t->a = 12345;
t->b = 54321;
cout <<"alokovat(): t->a: " <<t->a <<" t->b: "<<t->b <<"\n";
return 0;
}

int main()
{
testovaci *t;
alokovat( t );
cout <<"main(): t->a: " <<t->a <<" t->b: "<<t->b <<"\n";
return 0;
}

Výsledek tohoto programu:
Konstruktor proveden
alokovat(): t->a: 12345 t->b: 54321
Segmentation fault (core dumped)

Nahlásit jako SPAM
IP: ...–
Reklama
Reklama
Jonyzz0
Návštěvník
19. 8. 2007   #2
-
0
-

Problém bude v tom, že ve funkci alokovat špatně předáváš parametr.
Máš 2 možnosti:

1. použít ukazatel na ukazatel



int alokovat(testovaci **t){
*t = new testovaci;
(*t)->a = 12345;
(*t)->b = 54321;
cout <<"alokovat(): t->a: " <<(*t)->a <<" t->b: "<<(*t)->b <<"\n";
return 0;
}

int main()
{
testovaci *t;
alokovat( &t );
cout <<"main(): t->a: " <<t->a <<" t->b: "<<t->b <<"\n";
delete t;
return 0;
}


2. Použít referenci na ukazatel


int alokovat(testovaci* &t){
t = new testovaci;
t->a = 12345;
t->b = 54321;
cout <<"alokovat(): t->a: " <<t->a <<" t->b: "<<t->b <<"\n";
return 0;
}

int main()
{
testovaci *t;
alokovat( t );
cout <<"main(): t->a: " <<t->a <<" t->b: "<<t->b <<"\n";
delete t;
return 0;
}


Nebo to taky můžeš upravit funkci alokovat aby uvnitř alokovala paměť a vrátila na ní ukazatel:


testovaci* alokovat(){
testovaci *t = new testovaci;
t->a = 12345;
t->b = 54321;
cout <<"alokovat(): t->a: " <<t->a <<" t->b: "<<t->b <<"\n";
return t;
}

int main()
{
testovaci *t = alokovat();
cout <<"main(): t->a: " <<t->a <<" t->b: "<<t->b <<"\n";
delete t;
return 0;
}

Nahlásit jako SPAM
IP: ...–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 106 hostů

Podobná vlákna

Dynamická alokace — založil Bananovnik

Dynamická alokace paměti — založil birkof

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý