od David » 2. 2. 2006 20:45
class SStk
{
public:
/* ... */
void push(const std::string & s);
private:
std::string * p_;
int allocated_, used_;
};
void SStk::push (const std::string & s)
{
[1] if (used_ >= allocated)
[2] {
[3] int n2 = (allocated_ +1) * 2;
[4] std::string * p2 = new string[n2];
[5] for(int i = 0; i < used_; ++i)
[6] p2
= p_;
[7] delete[] p_;
[8] p_ = p2;
[9] allocated_ = n2;
[a] }
p_[used_] = s;
[c] ++used_;
}
Na kterych radcich muze byt vyvolana vyjimka?
odpoved:
4, 6, b
(4 - pro nedostatek pameti. 6 - to, ze jsme zvetsili alokovanou pamet dvakrat jeste neznamena, ze je vetsi nez used; navic opet muze spadnout pro nedostatek pameti (volani copy konstruktoru operatorem =, tedy alokace pameti). b - vubec nezkoumame velikost s; opet alokujeme pamet v copy konstruktoru)
otazka:
Pokud nastane vyjimka:
[A] zanecha zasobnik v nezmenenem stavu
muze zpusobit ztratu (nedostupnost) alokovane pameti
[C] muze zanechat zasobnik v nekonzistentnim stavu, ktery muze zpusobit behovou chybu
odpoved:
B, C
(na foru se objevil clovek, kteremu bylo zatrzene C pocitano jako chyba B - napriklad pokud spadneme na 4; C - pokud spadneme treba na radku 6. pred tim jsme alokovali misto pro string p2. pri padu ale tuhle pamet neuvolnime a me prijde, ze to koliduje s prvnim bodem v 'definici' konzistence a to je "nedostupna data byla korektne destruovana a odalokovana")
Podle me je C spatne. - Vyjimka na radku 6 sice zanecha zasobnik v nekonzistentnim stavu, ale ne v takovem, ktery muze zpusobit behovou chybu. (nemam tam zadny ukazatel, ktery ukazuje na odalokovanou pamet, takze to nespadne).
Je pravda, ze tohle je jen takove slovickareni. Ale zase muset se pak kvuli tomu hadat z clovekem, ktery to opravuje -> Bednarkem -> dekanem -> ...
[quote]
class SStk
{
public:
/* ... */
void push(const std::string & s);
private:
std::string * p_;
int allocated_, used_;
};
void SStk::push (const std::string & s)
{
[1] if (used_ >= allocated)
[2] {
[3] int n2 = (allocated_ +1) * 2;
[4] std::string * p2 = new string[n2];
[5] for(int i = 0; i < used_; ++i)
[6] p2[i] = p_[i];
[7] delete[] p_;
[8] p_ = p2;
[9] allocated_ = n2;
[a] }
[b] p_[used_] = s;
[c] ++used_;
}
Na kterych radcich muze byt vyvolana vyjimka?
odpoved:
4, 6, b
(4 - pro nedostatek pameti. 6 - to, ze jsme zvetsili alokovanou pamet dvakrat jeste neznamena, ze je vetsi nez used; navic opet muze spadnout pro nedostatek pameti (volani copy konstruktoru operatorem =, tedy alokace pameti). b - vubec nezkoumame velikost s; opet alokujeme pamet v copy konstruktoru)
otazka:
Pokud nastane vyjimka:
[A] zanecha zasobnik v nezmenenem stavu
[B] muze zpusobit ztratu (nedostupnost) alokovane pameti
[C] muze zanechat zasobnik v nekonzistentnim stavu, ktery muze zpusobit behovou chybu
odpoved:
B, C
(na foru se objevil clovek, kteremu bylo zatrzene C pocitano jako chyba :( B - napriklad pokud spadneme na 4; C - pokud spadneme treba na radku 6. pred tim jsme alokovali misto pro string p2. pri padu ale tuhle pamet neuvolnime a me prijde, ze to koliduje s prvnim bodem v 'definici' konzistence a to je "nedostupna data byla korektne destruovana a odalokovana")
[/quote]
Podle me je C spatne. - Vyjimka na radku 6 sice zanecha zasobnik v nekonzistentnim stavu, ale ne v takovem, ktery muze zpusobit behovou chybu. (nemam tam zadny ukazatel, ktery ukazuje na odalokovanou pamet, takze to nespadne).
Je pravda, ze tohle je jen takove slovickareni. Ale zase muset se pak kvuli tomu hadat z clovekem, ktery to opravuje -> Bednarkem -> dekanem -> ...