2009-08-24 16 views
1

Meine Firma wird derzeit nicht von den Boost-Bibliotheken gewonnen und während ich sie benutzt habe und sie für einige Arbeiten durchgesetzt habe, werden einige Projekte aufgrund ihrer Natur nicht verwendet werden dürfen Boost. Grundsätzlich können Bibliotheken, wie Boost, nicht zur Arbeit gebracht werden, daher bin ich auf die standardmäßig verfügbaren Bibliotheken beschränkt (derzeit mit Visual Studio 2005).Verwendung von STL-Containern ohne Boost-Pointer

Also ... meine Frage ist, wenn ich nicht Boost :: shared_ptr und seine kleinen Brüder verwenden kann, was ist die Alternative, wenn Sie STL-Container mit Zeigern verwenden?

Eine Option, die ich sehe, ist das Schreiben einer Container-Klasse wie shared_ptr, die nach einem bestimmten Zeiger sucht, aber ich würde gerne wissen, ob es zuerst andere Alternativen gibt.

+17

Kopieren Sie einfach den Boost-Code und geben Sie der Klasse Ihren eigenen Namen. –

+0

Neils Idee ist einfach genial :) –

+0

Es ist auch eine Verletzung der Boost-Lizenz, es sei denn, Sie fügen die Boost-Lizenz in die abgeleitete Arbeit ein.Da Lizenzierungsängste (unberechtigt in diesem Fall, aber verständlich) Teil der Gefahren der Verwendung von externem Code sind, ist diese spezielle Vorgehensweise wahrscheinlich nicht der beste Weg, Freunde zu finden. –

Antwort

3

Wenn sie Boost nicht akzeptieren, nehme ich an, dass andere "nicht hier entwickelt" Bibliotheken nicht in Frage kommen.

Es scheint mir, Sie mit zwei Optionen links:

  • rollen Sie Ihre eigenen shared_ptr.
  • Verwenden Sie rohe Zeiger und verwalten Sie den Speicher selbst.

Weder ist ideal, und jedes kommt mit seinen eigenen Schmerzen. Ihre rettende Gnade könnte sein, dass Sie alle Quellen zur Verfügung haben, die Ihnen zur Verfügung stehen. Sie können es als Modell für das Schreiben Ihres eigenen shared_ptr verwenden.

+0

Ein einfacher Nicht-Thread-Safe shared_ptr sollte kein Problem sein. Das Hinzufügen von threadsicherheit kann das Problem komplizierter machen. –

+0

Es gibt gut beleuchtete und gute Beispiele. – luke

+0

Ich stimme zu, je nach dem, was Sie tun, ist die manuelle Speicherverwaltung (Löschen aller Zeiger selbst vor der Zerstörung des Containers) nicht so schwierig. Ich bin auch den gleichen Weg gegangen und war gezwungen, unsere eigene shared_ptr Implementierung zu erstellen, nachdem wir Boost in unserer Codebasis nicht verwenden konnten. –

1

Das hängt definitiv davon ab, was Sie tun möchten. Es ist nicht so, als wäre shared_ptr für ein Projekt, das Zeiger verwendet, absolut notwendig.

Wenn Sie sie wirklich benötigen, importieren Sie die Klassen/Vorlagen/Funktionen, die Sie wirklich benötigen, in Ihr eigenes Projekt, wenn möglich, ohne die gesamte Boost-Lib zu importieren.

+0

Es liegt daran, die Dinge von einem Kodierungsstandard und einem rechtlichen Standpunkt (FOSS) genehmigt zu bekommen. Die meisten Leute hier sind sich bewusst, dass die rechtliche Seite in Ordnung ist, aber es wurde nicht offiziell angegeben, so dass das Importieren von Code aus Boost oder anderswo nicht erlaubt ist. Es gibt Ausnahmen und ich möchte Boost genehmigen, aber momentan leider nicht. –

+0

Sie haben darüber gesprochen, den Code selbst zu schreiben. Meine Idee war, dass Sie den Boost-Code nehmen, aber Unternehmen intern behandeln Sie es als Ihren eigenen Code. Vorteil ist, dass viele Leute Ihren Code bereits getestet haben. – StampedeXV

2

In Visual Studio 2008 ist std::tr1::shared_ptr verfügbar. Ich bin nicht sicher, dass es in VS2005 verfügbar ist, sollten Sie überprüfen.

+0

Nein, kann es nicht sehen. Ich habe TR1 für andere Arbeiten benutzt, die ich gemacht habe, aber diese Arbeit benutzt VS2005. –

+0

Nun, Sie könnten immer noch seine Implementierung kopieren. Ich glaube, dass es besser kopierbar ist als die Implementierung. –

+0

@ JIa3ep: Ich bezweifle das ernsthaft. Es ist schließlich die Arbeit einer kommerziellen Firma (Dinkumware). – sbi

0

Ohne den Hintergrund zu kennen, ist es schwer zu sagen, warum Boost-Bibliotheken nicht erlaubt sind. Wenn Sie komplexe Abhängigkeiten vermeiden möchten, können Sie das Problem einfach umgehen: Fast alle Boost-Bibliotheken arbeiten nur mit einem einfachen #include-Header: Kurz gesagt, sie brauchen keine Verknüpfungen und vermeiden so dll-hell oder eine Variante davon.

Wenn also externe Bibliotheken wegen der Komplexität der Verknüpfung (statisch oder dynamisch) nicht geschätzt werden, können Sie die benötigten Boost-Header einfach per Hand in das Projekt kopieren und direkt verwenden.

Aus Gründen der Übersichtlichkeit und um zukünftige Upgrades und Wartungsarbeiten zu vereinfachen, würde ich es vermeiden, die Boost-Bibliotheken umzubenennen (damit zukünftige Programmierer wissen, wo der Code herkommt). Wenn "sie" solche einfachen Code-Einschlüsse nicht wollen, dann könntest du argumentieren, dass einige Boost-Header in die Spezifikation aufgenommen werden und dass sie jedem eine Menge Kopfschmerzen und Zeit ersparen. Rechtlich ist die Boost-Lizenz so konzipiert, dass sie so einfach und sicher wie möglich integriert werden kann: Alle Dateien haben eine explizite Lizenz, die alle relevanten Dinge zulässt, und fast alle Bibliotheken haben genau die gleiche Lizenz.

Ich bin gespannt: Warum genau sind Boost-Header nicht zulässig?

+0

Es ist im Grunde, weil einige Kundenanforderungen, dass externe Bibliotheken nicht erlaubt sind, einige Projekte sind sicherheitskritisch und alle Code (einschließlich Bibliotheken) muss zertifiziert werden, einige Projekte wollen nicht FOSS für rechtliche Probleme und insgesamt alle Code, Bibliotheken, Anwendungen usw. müssen für die Verwendung genehmigt werden, und das bedeutet, dass es Zeit braucht, um eine Genehmigung zu erhalten, wenn überhaupt. Einige würden es bekommen, andere nicht, und für diejenigen, die nicht nach Alternativen suchen. –

+1

Einfach die von Ihnen benötigten Boost-Header per Hand in Ihr Projekt kopieren, ist nicht so einfach. Boost ist so inzestous, dass Sie 100 Dateien einbeziehen werden, bevor Sie es wissen. Ja, sie haben ein Werkzeug, um Bibliotheken auszubrechen, und Sie verwenden es besser, um eine frustrierende Erfahrung zu vermeiden. –

+0

Beachten Sie, dass es nicht ist, weil Sie Link-Zeit-Abhängigkeiten vermeiden, Sie haben sie nicht: Exportieren der 'gleichen' enthaltenen Klasse aus 2 separaten DLLs wird leicht zu einem Problem, wie es bereits ist, mit Standardcontainern. – xtofl

Verwandte Themen