2016-04-07 27 views
0

unordered_map öğesine yapılan başvuruları silmeye çalışıyorum. bunun sorumlusu benim sınıfların bir parçası gibi görünür:Unordered_map dosyasında işaretçi silme

Node n("My node"); 
    graph.nodes.insert({n.name,n}); 
    edge.from = &graph.nodes[n.name]; 

    // Some other stuff 

    for(auto& edge : graph.edges) 
    { 
     if(edge.from->to_delete) 
     { 
      graph->nodes->erase(edge.from->name); 
      delete edge.from; 
      edge.from = NULL; 
     } 
     if(edge.to->to_delete) 
     { 
      graph->nodes->erase(edge.to->name); 
      delete edge.to; 
      edge.to = NULL; 
     } 

     if(edge->from && edge->to) 
      DoSomethingWithNodes(edge->from, edge->to); 
     else 
      removeEdge(edge); 
    } 

Şu anda siliyorum işaretçileri bu answer ama I dayalı:

class Edge: 
{ 
    public: 
     Node* from; 
     Node* to; 
} 

class Node: 
{ 
    public: 
     std::string name; 
     bool to_delete; 
} 

class Graph: 
{ 
    public: 
     std::unordered_map<std::string, Node> nodes; 
     std::vector<Edge> edges; 
} 

ve

benim ana dosya kodu böyle bir şey yapıyorum delete ile satırda segmentasyon hatası alıyorum. Aynı cevapta, smart pointers'u kullanma önerisi de vardır. Burada shared_ptr'u kullanma konusunda emin değilim. Buradaki seçeneğim var, birden çok kenarın bir düğüm nesnesine işaretçisi olacak, ancak aslında grafiğin unordered_map değerinden erase düğümünü kullanacağım zaman ne olacak. Orada işaret ediyor olsaydı, eğer/else koşulu için yanlış olur mu? Bunu tam olarak anlamadım.

DÜZENLEME:

Ben silinir önce bir düğüm adını görüntülemek istediğimizi varsayalım. Ben edge.from->to_delete yaşadıysanız olarak nedense çünkü bazen gerçek dönen, boş göstericilerle karşı herhangi bir koruma olmaz, şu anda

for(auto& edge : graph.edges) 
{ 
    if(edge.from->to_delete) 
    { 
     printf("Node to delete: %s",edge.from->name.c_str()); 
     graph->nodes->erase(edge.from->name); 
     edge.from = nullptr; 
    } 
    if(edge.to->to_delete) 
    { 
     printf("Node to delete: %s",edge.to->name.c_str()); 
     graph->nodes->erase(edge.to->name); 
     edge.to = nullptr; 
    } 

    if(edge->from && edge->to) 
     DoSomethingWithNodes(edge->from, edge->to); 
} 

: Ben böyle bir şey olacak. Denediğim şey şu koşulların değişmesidir:

Ancak hiçbir şekilde yardımcı olmuyor.

+0

seferinde bir soru sor. Eğer program beklendiği gibi davranmıyorsa MCVE – Slava

+0

@Slava bağlı değil mi? Başka bir soru olduğunu düşünmüyorum. – sebap123

+0

Zaten "unordered_map'de nesneye işaretçi silme" ile ilgili sorunuzu yanıtladım, kodunuzun beklendiği gibi çalışmaması neden farklı bir soru. Her şeyden önce, ona cevap vermek için yeterli bilgi yok. – Slava

cevap

0

Şu anda Bunu cevabını anlamadı

bu Yanıta göre işaretçileri siliyorum - Eğer new tarafından oluşturulan ve onlar için sahipliğini kontrol sadece delete nesneler, sizin durumda nesneler yönetilen olabilir std::unordered_map tarafından işaretçi değil, değerle depolar. Bu durumda, bu nesneler üzerinde delete'u arayamazsınız ve std::unordered_map::erase()'u çağırmak, nesnenin silinmesi için yeterlidir.

Örnekler:

std::unordered_map<std::string,Someclass> mymap; 
mymap.insert(std::make_pair("foobar", Someclass()); // adding object by value 
... 
mymap.erase("foobar"); // object managed by map and will be deleted 

ya da aramak gerektiğinde silin:

std::unordered_map<std::string,Someclass *> mymap; 
mymap.insert(std::make_pair("foobar", new Someclass()); // adding object by pointer 
... 
auto f = mymap.find("foobar"); 
if(f != mymap.end()) { 
    delete f->second; // you need to delete object that you created by new before 
    mymap.erase(f); 
} 
+0

Bilgi için teşekkür ederiz. Bu durumda geçerli olmadığını biliyordum. Bu durumda “yeni” in örtülü olarak adlandırıldığını düşündüm. Peki bu işaretçileri silmek için ne önerirsiniz? – sebap123

+0

Onları silmemenizi öneriyorum, mantığa göre bunları değiştirin (bu silinen öğe artık işaretli değil) – Slava

+0

Örneğin 'edge.from', örneğin erase() işlevi bir çöp kutusuna işaret etsin, değil mi? Edge.from = nullptr; 'gibi bir şey yapmamalı mıyım? Çünkü bu düğümden isim okumak güvenli olup olmadığını nasıl anlayacağım? – sebap123

İlgili konular