2016-07-24 8 views
0

私はこのような2クラスがあります。このリストはゴミのメモリですか?

がfoo.h

class A //base class 
{ 
public: 
    A(QList<int> &timers, QList<int> &positions); 
    int pIndex = 0; 
    QList<int> timers; 
    QList<int> positions; 
}; 


class B : public A 
{ 
public: 
    B(); 
private: 
    QList<int> t { 5, 8, 10, 20, 25 }; 
    QList<int> p { 10, 15, 20 }; 
}; 

foo.cpp

B::B() 
    : A(t, p) 
{ 
} 

A::A(QList<int> &t, QList<int> &p) 
{ 
    foreach (int v, t) { 
     qDebug() << "v = " << v; 
    } 

    //this->timers = t; 
    //this->positions = p; 
} 

を私はBクラスをintitializeとき、それはSGIFAULTについて言っクラッシュします。

auto b = new B(); 

このエラーが発生する可能性はありますか。

class A 
{ 
public: 
    A(int p[3]) 
    { 
     this->v = p; 
    } 

    void print() 
    { 
     for(int i = 0; i < 3; ++i) 
     { 
      printf("v = %d\n", v[i]); 
     } 
    } 
private: 
    int *v = NULL; 
}; 

class B : public A 
{ 
public: 
    B() : A(values) 
    { 
    } 
private: 
    int values[3] = {1, 2, 3}; 
}; 

int main() { 
    A *o = new B(); 
    o->print(); 
} 
+0

はvalgrindのを使用してみてください。 – Elazar

答えて

2

問題は、tpです:最初に私はそれは私が一度にガベージメモリになっていた通過を渡すが、同じ原理に従うが、int[]むしろQList<int>を使用して、このコードは細かい作業を行うことQListのだと思いましたあなたは、基本クラスのコンストラクタを呼び出したときに、まだ構築されていません。

チェックこのアウト(staticメンバーは、任意のクラスオブジェクトが作成される前に構築されている、あなたが探している解決策ではないかもしれません。この点に注意してください):

class B : public A 
{ 
public: 
    B(); 
private: 
    static QList<int> t; 
    static QList<int> p; 
}; 

QList<int> B::t { 5, 8, 10, 20, 25 }; 
QList<int> B::p { 10, 15, 20 }; 

今ではコンパイルし、出力も

5 
8 
10 
20 
25 

、あなたは、基本クラスのコンストラクタに二QListを渡しませんでした。

オルタナティブバージョン:

class A 
{ 
public: 
    //const references 
    A(const QList<int> &timers, const QList<int> &positions); 
    int pIndex = 0; 
    QList<int> timers; 
    QList<int> positions; 
}; 


class B : public A 
{ 
public: 
    B(); 
private: 
    // no need for QList members 
}; 


B::B() 
    : A({ 5, 8, 10, 20, 25 }, { 10, 15, 20 }) // use initializer lists directly 
{ 
} 

A::A(const QList<int> &t, const QList<int> &p) 
{ 
    for (int v : t) { 
     qDebug() << "v = " << v; 
    } 
} 

int main() 
{ 
    auto b = new B(); 
    delete b; 
} 
+0

静的メンバーとして 'p'と' t'をマークすることはできません。コンストラクタ時にそれを渡すための代替手段がありますか?私は秒を過ぎていませんが、これはSO – Jack

+0

@Jackにここに投稿する最小のコード例を作ったときの間違いでした。注意深く見ると、それぞれの 'QList'の2つの正確な複製があることがわかります。 'B'クラスの' QList'オブジェクトの作成を省略し、値を 'A'コンストラクタに直接渡すこともできます。しかし、引数 'const'を参照することを忘れないでください。 – xinaiz

+0

パスの値を直接ベースクラスにすると、このようになりますか? 'SleepValueHigh :: SleepValueHigh() SleepValueDef({5,8,10,20,25}、{1,2,3}){}'この値をクラスの変数メンバとして使用したいと思います。 Bクラスからtとpの参照を保持するために、基本クラスのポインタを使用できますか? – Jack

関連する問題