2016-04-27 5 views
2

Es scheint eine Regression in C++ - Compiler in VS2015 Update 2 - falsche Adresse einer Basisklasse Datenelement wird berechnet, wenn mehrere Vererbung mit einer der Klassen verwenden ein virtueller Destruktor. Code-Beispiel:Zeiger auf eine nicht statische Datenelemente in VS2015 falsch Update 2

// Example program 
#include <iostream> 
#include <limits> 

struct V 
{ 
    virtual ~V() {}; 
}; 
struct B 
{ 
    int i; 
}; 
struct A : public B, public V 
{ 
}; 
int main() 
{ 
    int A::* a1 = &A::i; 
    A a; 

    a.i = std::numeric_limits<int>::max(); 

    if (a.*a1 == std::numeric_limits<int>::max()) 
     std::cout << "ok\n"; 
    else 
     std::cout << "nok\n"; 
} 

Es sieht aus wie a1 die zu V-Tabelle versetzt wird statt i.

Dieser Code verwendet ok in VS2015 bis Update 1 und nok in Update drucken 2. Meine Kontrollen in GCC und Clang gedruckt auch ok.

Gibt es Einschränkungen bei der Mehrfachvererbung beim Arbeiten mit Zeigern an Mitglieder?

Antwort

0

Beantworten Sie meine eigene Frage, falls jemand das gleiche Problem hat: Es gibt tatsächlich eine regression in Update 2, wie auch on MSDN forums diskutiert. Grundsätzlich haben Sie zwei Möglichkeiten:

  1. Verwenden Sie /vmg Compiler-Schalter (Dies wird die Größe Ihrer Binärdatei erhöhen).
  2. Get über Basisklasse &B::i und Zuweisen zu der abgeleiteten Klasse Offset korrigieren A
Verwandte Themen