Ich sehe einige Beispiele für inline const
Variablen, 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)
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.
Lass mich ein paar Worte sagen