Inline-Variable wird mehrmals initialisiert

Darune

Ich sehe einige Beispiele für inline constVariablen, die dreimal mit Visual Studio 2017 initialisiert (und zerstört) werden. Ist dies ein Fehler mit dem Linker? oder soll das anders kommen?

Linker Comdat Folding ist auf Off gesetzt.

Beispielcode:

#pragma once

struct A {
  A() {
    static int count = 0;
    ++count;
    ASSERT(count == 1);
  }
  ~A() {
  }
};


inline const A a = A();

In meiner Lösung habe ich das Assert-Feuer zweimal (Ein Konstruktor, der dreimal aufgerufen wird). Die Überprüfung des Aufrufstapels zeigt, dass alle Aufrufstapel identisch sind und alle Aufrufe vom dynamischen Initialisierer für a () stammen. Jetzt weiß ich, dass diese Klasse in anderen Teilen der Lösung nicht verwendet wird, da ich sie gerade erstellt habe, um dieses Problem zu untersuchen.

Ich benutze VS17 15.8.9

Update: Fehlerbericht hier https://developercommunity.visualstudio.com/content/problem/297876/static-inline-variable-gets-destroyed-multiple-tim.html (Sie können sich für eine Verbesserung des Bugfixes entscheiden)

Peter Ruderman

Dies scheint ein MSVC-Fehler zu sein. Ich kann es mit dem folgenden Code reproduzieren (auch mit VS2017 15.8.9). Interessanterweise kann ich nur mit einem Debug-Build reproduzieren. Im Release-Modus scheint uns der Optimierer zu retten.

Common.h

#pragma once

#include <iostream>

class Foo
{
public:
  Foo()
  {
    std::cout << "Constructing a Foo" << std::endl;
  }

  ~Foo()
  {
    std::cout << "Destructing a Foo" << std::endl;
  }
};

inline Foo const Bar;

other.cpp

#include "common.h"

void DoOtherStuff()
{
  std::cout << &Bar << std::endl;
}

main.cpp

#include "common.h"

void DoStuff()
{
  std::cout << &Bar << std::endl;
}

extern void DoOtherStuff();

int main()
{
  DoStuff();
  DoOtherStuff();
}

Ausgabe (Debug)

Constructing a Foo
Constructing a Foo
00007FF74FD50170
00007FF74FD50170
Destructing a Foo
Destructing a Foo

Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.

Bei Verstößen wenden Sie sich bitte [email protected] Löschen.

bearbeiten am
0

Lass mich ein paar Worte sagen

0Kommentare
LoginNach der Teilnahme an der Überprüfung

Verwandte Artikel

Warum wird eine statische Inline-Variable einer Vorlagenklasse nicht initialisiert?

Warum wird Bean während Junit-Tests mehrmals initialisiert?

Fullpage.js wird in einer eckigen App mehrmals initialisiert

Wie wird diese Variable initialisiert?

Warum wird die Variable nicht initialisiert?

Die statische Variable wird zweimal initialisiert

Statische Variable wird nicht auf Null initialisiert

Statische Variable wird nicht sofort initialisiert

Warum wird private Variable in Dart nicht initialisiert?

Wie kann verhindert werden, dass die SwiftUI-Anfangsansicht mehrmals initialisiert wird, wenn @State-Variablen initialisiert werden?

Kann eine statische Variable aufgrund des Entladens von Klassen mehrmals initialisiert werden?

Warum wird NSManagedObject nicht in einen untergeordneten NSManagedObjectContext eingefügt, wenn der Kontext inline initialisiert wird?

Warum wird die Variable thread_local hier nie initialisiert?

Warum besteht Kotlin darauf, dass die Variable "ret" initialisiert wird?

Warum wird die Variable in diesem BEGIN NICHT richtig initialisiert?

String-Variable, die mit String Literal Pool initialisiert wird

Die statische Variable der Java-Schnittstelle wird nicht initialisiert

Wie initialisiere ich eine Variable, wenn IBOutlet initialisiert wird?

Warum wird die lokale Variable standardmäßig initialisiert?

Fehler: Parameter für <Variable> wird in C . initialisiert

Nicht-nullfähige Variable wird nicht initialisiert

Wo wird diese Solidity-Mapping-Variable initialisiert?

Ziel C - Wie wird eine statische Variable nur einmal initialisiert?

Android: Variable wird in ViewModel nicht initialisiert, nachdem sie im Fragment initialisiert wurde

Warum wird inline-deklariertes itab nicht in AT SELECTION SCREEN OUTPUT initialisiert?

Firebase wird nicht initialisiert

wird nach [-Wreorder] initialisiert

InMobiBanner wird nicht initialisiert

DRF Serializer wird initialisiert

TOP Liste

  1. 1

    So legen Sie mit dem Interface Builder unterschiedliche führende Speicherplätze für unterschiedliche Geräte fest

  2. 2

    Wie konvertiere ich einen Vektor von Bytes (u8) in eine Zeichenfolge?

  3. 3

    Wie kann ich in SCSS mehrere Klassen zu einer einzigen kombinieren?

  4. 4

    Eclipse Oxygen - Projekte verschwinden

  5. 5

    Wie konvertiert man einen Datenrahmen im langen Format in eine Liste mit einem geeigneten Format?

  6. 6

    Wie kann ich den Kaskadenmodus global einstellen?

  7. 7

    Wie erstelle ich einen neuen übergeordneten Knoten außerhalb der .ref (/ path) in der Firebase-Echtzeitdatenbank mithilfe von Cloud-Funktionen (Typescript)?

  8. 8

    So erhalten Sie eine gleichmäßige Höhe für alle Eingabefelder

  9. 9

    Python: Spalten mit demselben Namen zusammenführen, wobei der Mindestwert beibehalten wird

  10. 10

    Speichern Sie ein MPAndroidChart-Diagramm in einem Bild, ohne es in einer Aktivität anzuzeigen

  11. 11

    Gruppieren Sie Datenrahmenspalten nach ihrem Datum (die Spaltentitel enthalten) und fassen Sie die Instanzen von Einsen und Nullen in R . zusammen

  12. 12

    ElasticSearch BulkShardRequest ist aufgrund von org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor fehlgeschlagen

  13. 13

    Tic Tac Toe-Spiel im React-Reset-Button funktioniert nicht

  14. 14

    Tomcat - Leiten Sie den alten Kontextstamm zum neuen Kontextstamm um

  15. 15

    Wie wählt man Unterschiede mit drei Tabellen aus?

  16. 16

    Ärgerliches Problem mit yaml, das ich nicht lösen kann

  17. 17

    Wie kann ich meine Tabelle abfragen, um sie in mySQL nach 2 Feldern zu gruppieren?

  18. 18

    So berechnen Sie die Verfügbarkeit von Anwendungen (SLA)

  19. 19

    Fügen Sie eine weitere Schaltfläche zu gwt Suggest Box hinzu

  20. 20

    Modbus Python Schneider PM5300

  21. 21

    Wie kann eine gleichmäßige Lastverteilung in ElasticSearch mit Indizes mit unterschiedlicher Anzahl von Shards erreicht werden?

heißlabel

Archiv