2017-05-03 3 views
-4

Wenn ich Zeile B laufe, scheint alles in Ordnung zu sein, aber wenn ich es gegen Linie A tausche, ist es abgestürzt, und ich weiß nicht warum.C++: Warum sind diese Smart Dynamic Pointer nicht verfügbar?

#include <iostream> 
#include <vector> 
#include <memory> 

using namespace std; 

int main() { 
    vector<int> vi(10,5); 
    auto ptr = make_shared<vector<int>>(vi); //A 
    // auto ptr = &vi; //B 
    auto beg = ptr->begin(); 
    while (beg != vi.end()) 
    cout << *beg++ << " "; 
    return 0; 
} 
+1

Bitte erstellen Sie Ihre Frage mit Code und mit der Erklärung, was das Problem ist. Nicht mit einer Verbindung zu etwas. – granmirupa

+0

Bitte fügen Sie die Liste des Programms in der Beschreibung, niemand möchte Bilder des Codes schauen .. – Gnqz

+0

Zusätzlich zu nicht Bilder schauen wollen; Wenn jemand anderes nach dem gleichen Problem sucht, werden sie es nicht finden können; oder wenn es Ihnen irgendwie gelingt, diese Seite aus Ihrer Frage zu finden, ist Ihr Code nicht mehr verfügbar. – UKMonkey

Antwort

1

Sie ptr->begin() und vi.end() verwenden. Wenn * ptr vi ist, ist das in Ordnung, aber Ihre make_shared<vector<int>>(vi) Zeile ruft tatsächlich den Kopierkonstruktor auf und erstellt eine neue Kopie von vi.

Wenn Sie wirklich eine shared_ptr in den Stapel erstellen müssen, müssen Sie es wie diese erstellen:

auto ptr = shared_ptr<vector<int>>(&vi, [](vector<int>*){}); //A 

diesem Zusammenhang die Shared_ptr eine leere deleter gibt, so wird es versuchen, nichts von dem Stapel löschen (was einen Absturz verursachen würde).

Hinweis: Dies ist fast immer eine schlechte Idee, da es den gesamten Zweck der shared_ptr verletzt; Es besitzt nichts mehr. Dies macht das Debugging verwirrend. Sie müssen sicherstellen, dass der Stapel Vektor definitiv lebt länger als was auch immer verwendet die shared_ptr oder Ihre App wird abstürzen.

+0

Hab es, danke Kumpel – Murphy