Warum ist es OK, um zurück-vector-aus-Funktion?

Bitte betrachten Sie diesen code. Ich habe gesehen, diese Art von code mehrmals. words einen lokalen Vektor. Wie ist es möglich, zu ihm zurückzukehren, der von einer Funktion? Können wir garantieren, es wird nicht sterben?

 std::vector<std::string> read_file(const std::string& path)
 {
    std::ifstream file("E:\\names.txt");

    if (!file.is_open())
    {
        std::cerr << "Unable to open file" << "\n";
        std::exit(-1);
    }

    std::vector<string> words;//this vector will be returned 
    std::string token;

    while (std::getline(file, token, ','))
    {
        words.push_back(token);
    }

    return words;
}
  • Es kopiert wird, wenn Sie zurückkehren.
  • Garantiert niemand.. Es sterben wird, aber nachdem es kopiert.
  • Sie haben nur ein problem, wenn die Funktion liefert eine Referenz : std::vector<std::string>&
  • Nein, es wird verschoben werden.
  • Nur garantiert in C++11?
  • Ja. C++11 ist der aktuelle standard, also C++11 wird C++.
  • Anscheinend sollten Sie auch vermeiden, Rückkehr Vektoren(und anderen Containern) in der öffentlichkeit .dll ' s, es sei denn, Sie können sicherstellen, dass die Laufzeit ist die gleiche. Vor allem für msvc, nicht sicher, ob gcc hat das gleiche problem.
  • Aufgrund von Problemen mit den zugreifen? Ich vermute, dass verschiedene Versionen von der MSVC-runtime-Bibliotheken können einige Behälter Mitglieder in unterschiedlicher Reihenfolge, so dass selbst wenn die Container haben die richtige Mitglieder wie pro die standard-offsets von Anfang an das Objekt, um Zugriff auf die Mitglieder können falsch sein, wenn ein Programm zusammengestellt für eine bestimmte Laufzeit mit einem anderen? (Obwohl ich bin mir ziemlich sicher, dass die meisten kompilierte Programme dynamisch gegen die MSVC-Bibliotheken erforderlich, den spezifischen DLLs waren Sie verbunden mit sowieso, aber das gleiche Prinzip gilt für die zwei statisch gelinkte Programme/DLLs.)
  • möglich, Duplikat der In C++ ist es immer noch schlechte Praxis, um wieder eine Vektor-Funktion?
  • Ja, offenbar seine zu tun, mit der Möglichkeit der einzelnen layouts. Ich denke, dass Sie funktionieren, geladen werden, Seite an Seite, nur nicht über die dll-Grenze.
  • nrvo nicht auch hier passieren?

Schreibe einen Kommentar