Permalänk
Medlem

[c++ | destructo]

Hej!

jag sitter med ett projekt och har fasnat helt totalt stop i hjärnan iaf det som ska förstöras är:
std::vector<std::vector <boxes*> >

skapas på följande vis:

void game::fillBoxes(){ for(size_t i = 0; i < boxRows; i++){ std::vector<box*> tmp0; for(size_t j = 0; j < boxColums; j++){ box* tmp1; if(i%2 == 0){ tmp1 = new box(); } else{ tmp1 = new steelBox(); } tmp0.push_back(tmp1); tmp1->setPosition(j*positionChangeX+marginan, i*positionChangeY+marginan); } boxes.push_back(tmp0); } }

Tack för hjälpen!!

Visa signatur

Смерть -это решение всех проблем. Нет человека - нет проблемы
Comp1: Ubuntu 16.04 Comp2: Arch Linux
Comp3: Ubuntu Server 16.04 Comp4: Centos 6.5
Comp5: Linux mint 16 Comp6: Raspberry pi (olika OS hela tiden)
Phone: Motorola Google Nexus 6

Permalänk
Medlem

segfault nu av denna:

for(size_t i = 0; i < boxes.size(); i++){ for(size_t j = 0; j < boxes.at(i).size(); j++){ delete boxes.at(i).at(j); } }

Visa signatur

Смерть -это решение всех проблем. Нет человека - нет проблемы
Comp1: Ubuntu 16.04 Comp2: Arch Linux
Comp3: Ubuntu Server 16.04 Comp4: Centos 6.5
Comp5: Linux mint 16 Comp6: Raspberry pi (olika OS hela tiden)
Phone: Motorola Google Nexus 6

Permalänk
Hedersmedlem

Just det där borde inte ställa till det; kan det inte vara en box-destruktor som trilskas?

Permalänk
Medlem

nja det tror jag inte då dom inner håller default destruktion som om det var en vektor med int's i.

men detta gjorde så jag inte får segfault iaf!

void game::deleteBoxes(){ for(size_t i = 0; i < boxes.size(); i++){ for(size_t j = 0; j < boxes.at(i).size(); j++){ delete boxes.at(i).at(j); } boxes.at(i).clear(); } boxes.clear(); }

Visa signatur

Смерть -это решение всех проблем. Нет человека - нет проблемы
Comp1: Ubuntu 16.04 Comp2: Arch Linux
Comp3: Ubuntu Server 16.04 Comp4: Centos 6.5
Comp5: Linux mint 16 Comp6: Raspberry pi (olika OS hela tiden)
Phone: Motorola Google Nexus 6

Permalänk
Datavetare

Varför överhuvudtaget jobba med "nakna" pekare? Rekommendationen för ny C++ kod, sedan C++11, är att man i stort sätt aldrig bör använda "nakna" pekare utan köra med std::shared_ptr<T>

Din metod skulle då bli något åt detta håll

void game::fillBoxes(){ for(size_t i = 0; i < boxRows; i++){ std::vector<std::shared_ptr<box>> tmp0; for(size_t j = 0; j < boxColums; j++){ std::shared_ptr<box> tmp1; if(i%2 == 0){ tmp1 = std::make_shared<box>(/* argument till box ctor */); } else{ tmp1 = std::make_shared<steelBox>(/* argument till steelBox ctor */); } tmp0.push_back(tmp1); tmp1->setPosition(j*positionChangeX+marginan, i*positionChangeY+marginan); } boxes.push_back(tmp0); } }

Du ska aldrig explicit anropa delete när du använder std::shared_ptr<> utan destruktorn kommer automatiskt köra när sista referensen försvinner.

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Medlem

vist inte det men nu vet jag.

Visa signatur

Смерть -это решение всех проблем. Нет человека - нет проблемы
Comp1: Ubuntu 16.04 Comp2: Arch Linux
Comp3: Ubuntu Server 16.04 Comp4: Centos 6.5
Comp5: Linux mint 16 Comp6: Raspberry pi (olika OS hela tiden)
Phone: Motorola Google Nexus 6