Blödes Warning bei std::copy



  • Ich benutze in meinem Code copy:

    copy(points, points+8, target);
    

    (points ist ein Array: Vector3 points[8]). Leider gibt das dieses Warning (VS2010):

    'std::_Copy_impl': Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'
    1> d:\microsoft visual studio 10.0\vc\include\xutility(2212) : see declaration of 'std::_Copy_impl'

    Was soll dieses Warning? Wie krieg ich das weg?



  • Nutze STD-Container...



  • Erstens: Was ist eigentlich "target"? Und bist du sicher, daß dort genügend Platz für die Kopie ist?
    Zweitens: Die Fehlermeldung beschreibt doch auch, wie du sie abschalten kannst:

    To disable this warning, use -D_SCL_SECURE_NO_WARNINGS.

    Drittens: Ich denke, jetzt wäre es eine gute Idee, über STL-Container (std::vector<>, std::tr1::array<>) nachzudenken.



  • CStoll schrieb:

    Erstens: Was ist eigentlich "target"? Und bist du sicher, daß dort genügend Platz für die Kopie ist?

    target ist ebenfalls ein Vector3 Array:
    Vector3 points[8];

    Die Arrays haben exakt die selbe Größe. Was soll dieses doofe Warning? Is doch total paranoid.

    CStoll schrieb:

    Zweitens: Die Fehlermeldung beschreibt doch auch, wie du sie abschalten kannst:

    To disable this warning, use -D_SCL_SECURE_NO_WARNINGS.

    Drittens: Ich denke,

    Ja klar. Hatte nur die Befürchtung, dass ich dann vielleicht andere sinnvolle Warnings unterdrücke. Einen vector oder sowas nehm ich nicht, da der Overhead unerwünscht ist.



  • warnerBros schrieb:

    Einen vector oder sowas nehm ich nicht, da der Overhead unerwünscht ist.

    Dann nimm std::tr1::array und wenn du Technical Review 1 nicht hast, dann boost::array .



  • Was für einen technischen Overhead hat vector denn?



  • Eisflamme schrieb:

    Was für einen technischen Overhead hat vector denn?

    Heap Allokationen.



  • Achso, in Ordnung.



  • Ich würde auch das Klassentemplate std::array nehmen. Ist im Release-Modus genauso schnell wie ein rohes Array, aber hat im Debug-Modus nützliche Index- und Iteratorchecks. Ausserdem hat die Klasse im Gegensatz zu Arrays Kopiersemantik, keine implizite Konvertierung zu Zeigern und ein STL-Interface (z.B. size() -Methode). Äusserst praktisch. Im Prinzip spricht in modernem C++ nichts dafür, noch rohe Arrays zu verwenden.

    Hm, ist nun mindestens das vierte Mal innerhalb kurzer Zeit, wo ich diese Empfehlung ausspreche... 🙂



  • Ok, ich habe mir gerade std::array angeschaut und finde das Ding eigentlich ganz angenehm. Bin jetzt umgestiegen auf std::array^^

    Eine Frage dazu: Was ist die beste Methode um ein std::array in einen std::vector zu kopieren?



  • std::vector<T> v(array.begin(), array.end());
    


  • Oder falls der std::vector schon besteht, kannst du assign() verwenden. Oder insert() , falls vorherige Elemente erhalten bleiben sollen.

    Dokumentation zu std::vector


Anmelden zum Antworten