2016-06-09 4 views
1

Ich habe eine Situation, in der ich Code habe, der mit rohen Zeigern arbeitet, und ich bin nicht berechtigt, Smart-Pointer-ify zu verwenden. Ich bin jedoch berechtigt, Smart Pointer in jedem neuen Code zu verwenden, den ich entwickle.Smart-Pointer mit Legacy-Code-Rohpointern integrieren

Zum Beispiel.

Ich habe eine bestehende Funktion wie:

void processContent() 
{ 
    ContentObject * myContent = new ContentObject(); 
    newFunction(myContent); 
} 

void newFunction(ContentObject * content) 
{ 
    // myVector is just a std::vector<ContentObject*>, defined elsewhere 
    myVector.push_back(content); 
} 

void doSomethingWithContent() 
{ 
    // There is some logic here, but ultimately based on this logic I want to remove entries, and free the memory they point to. 
    myVector.pop_back(); 
} 

ich die Kontrolle über den Inhalt von "newFunction" haben und "doSomethingWithContent". Aber das in newFunction übergebene Argument ist behoben. Natürlich konnte ich manuell den Zeiger in myVetor löschen, bevor ich ihn löste, aber ich fragte mich, ob ich hier intelligente Zeiger implementieren kann, damit es "automatisch" für mich passiert?

Kann ich einen in eine Funktion übergebenen unformatierten Zeiger in einen unique_ptr umwandeln, ihn dann zu einem Container hinzufügen und ihn löschen lassen, wenn er aus dem Container entnommen wird?

Dank

Joey

Antwort

1

Angenommen, Sie Ihre myVector wie folgt definieren:

std::vector<std::shared_ptr<ContentObject>> myVector; 

In diesem Fall können Sie auf intelligente Zeiger in Ihrem Code und myVector halten wechseln können alle Ihre Objekte wie Sie erwartet haben:

void newFunction(ContentObject * content) 
{ 
    myVector.push_back(std::shared_ptr<ContentObject>(content)); 
} 

void doSomethingWithContent() 
{ 
    // There is some logic here, but ultimately based on this logic I want to  remove entries, and free the memory they point to. 
    myVector.pop_back(); 
}