0

Ich habe eine statische Bibliothek. Ich hatte durch die meisten Fragen auf Stack-Überlauf gegangen, aber konnte nicht kommen, zu einem richtigen AbschlussVerzögerung der Intailisierung der statischen globalen Variablen der gemeinsam genutzten Bibliothek

C++ static initialization order

Ich habe folgende Dateien

Datei ist myNew.h

#include <cassert> 
#include <stdio.h> 
void* operator new(size_t sz); 

class myNew { 
    public: 
     myNew() { 
      initialize(); 
     } 
     static void* newPageCheck(); 
     static bool val; 

    private: 
     static void initialize(); 
}; 

Datei myNew. c

#include "myNew.h" 
static myNew myNewObj __attribute__ ((init_priority (80))); 
bool myNew::val = false; 

// overload default new operator 
extern void* operator new(size_t sz) { 
    return myNew::newPageCheck(); 
} 

void myNew::initialize() { 
    val = true; 
} 

void* myNew::newPageCheck() { 
    assert(val == true); 
    int i ; 
    return &i 
} 

Datei my_slib_new.h

#include <stdio.h> 

class myFoo { 
    public: 
     myFoo() { 
      int *i = NULL; 
      i = new int ; 
      funS(); 
     } 
     void funS(); 
}; 

Datei my_slib_new.cc

#include "my_slib_new.h" 
static myFoo foo __attribute__ ((init_priority (2000))); 

void myFoo::funS() { 
    int *i = new int; 
} 

Datei sample_open_new.cpp

#include <stdio.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include "my_slib_new.h" 
int main() { 
    printf ("Your Program will run ... \n"); 
    int status = open("./libSharedNew.so",0); 
    return 0; 
} 

Ich habe folgende Schritte

Schritt 1: Zunächst erstellt die die statische Bibliothek von myNew.cc

1) g++ -g -c -fPIC myNew.cc 
2) ar rcs libStaticNew.a myNew.o 

Schritt 2: Erstellt gemeinsame Bibliothek von my_slib_new.cc

3) g++ -g -c -fPIC my_slib_new.cc 
4) g++ -shared -o libSharedNew.so my_slib_new.o 

Schritt 3:

5) gcc -Wall -o myTest sample_open_new.cpp -L . -lSharedNew -lStaticNew 

Wenn ich laufen myTest ich Fehler erhalten folgende Behauptung

Assertion `MyNew :: val == true 'failed ist, weil das statische globale Objekt

statische myFoo foo Attribut ((init_priority (2000))); wird vor dem statischen globalen Objekt initialisiert

statisch myNew myNewObj Attribut ((init_priority (80)));

Meine Forderung ist ich nicht linStaticNew.a zu sharedLibrary .libStaticNew.a ändern kann als statisch bleibe nur

Ich habe versucht, das Laden der gemeinsam genutzten Bibliothek zu verzögern durch offenen Systemaufruf in sample_open_new.cpp verwenden, aber es hat nicht Arbeit.

Gibt es irgendeine Art und Weise wir das Laden der gemeinsam genutzten Bibliothek libSharedNew.so verzögern kann, ist die Idee, die statische globale Objekt statisch myNew myNewObj Attribut ((init_priority (80))); zuerst, bevor statische globale myFoo Objekt sollte

initialisiert werden, oder gibt es andere, die wir das statische globale Objekt von statischer Bibliothek libStaticNew.a sollten zunächst initialisiert werden

Antwort

0

Kurze Antwort geben können: nein, nicht wie Sie versuchen zu tun es.

Längere Antwort: Ja, Sie sollten auf dem Static initialization order fiasco nachlesen. Grundsätzlich gibt C++ keine Garantie über die Initialisierungsreihenfolge und der beste Rat ist "Vermeiden Sie die Verwendung globaler Statik über verschiedene Kompilierungseinheiten". Aber es gibt auch andere Optionen als auch (in der FAQ erwähnt oben verlinkten - here

+0

gibt es eine sauberere Möglichkeit, die shared library zur Laufzeit zu laden.Ich verknüpfe dies nicht mit der Anwendung, aber die gemeinsame Bibliothek zur Laufzeit laden – TechEnthusiast

0

Verwenden Singletons Meyers' Singleton einfach ist, wie folgt aus:.

auto some_object() 
    -> Object& 
{ 
    static Object the_object; // Possibly constructor arguments here 
    return the_object; 
} 

Hier wird das Objekt bei der ersten Verwendung konstruiert.

+0

Singletons verursachen so viel Ärger, dass ich nicht empfehlen würde, sie zu verwenden sie beginnen abhängig voneinander, die du trouble hast Wenn du sie in der richtigen Reihenfolge zerstörst und sie zerstört werden, nachdem du "main" verlassen hast, musst du sicherstellen, dass sie in Ordnung sind, da die meisten der Welt zu dieser Zeit verschwunden sind. Sag einfach nein. Sie sind eine Anti-Muster-IMO und aus guten Gründen. –

+0

@JesperJuhl: Richtig du bist. Verwenden Sie sie nicht in neuem Code, wenn Sie es vermeiden können. Aber der Rat ist in diesem Zusammenhang falsch: Hier geht es darum, ein System zu reparieren, das unter dem statischen Initialisierungsreihenfolge-Fiasko leidet, und für diese Aufgabe sind Singletons "die" Lösung. Es ist sogar [ein FAQ-Element] (https://isocpp.org/wiki/faq/ctors#static-init-order-on-first-use), obwohl die FAQ nicht die bequeme Meyers Singleton dieser Antwort verwendet . –

Verwandte Themen