2017-08-15 4 views
0

を削除することは可能です:私は、リスト内のオブジェクトを削除することができますし、私はリストをクリアすることができますが、それは私がオブジェクトが動的に割り当てられ、その後、放出されているいくつかのレガシーコード持って間接参照ポインタ

QList<MyClass *> *list = new QList<MyClass *>(); 
... 
emit listReady(*row); 

void OtherClass::slotList(QList<MyClass> list) { 
    ... 
    delete list??? 
} 

を、それがあります私のスロットでitsefのリストを削除することは可能ですか?

+1

最初の 'list'(ポインタ)は実際に' row'という名前にして後でその使用法に合わせるべきですか? – Angew

答えて

5

私のスロットにリストを削除することは可能ですか?

いいえ、不可能です。あなたのスロットは値でリストを受け入れるので、元のQList<MyClass *> *listオブジェクトのコピーです。

void OtherClass::slotList(QList<MyClass> list)

あなたはlistへのポインタを受け入れるようにslotListの引数を変更する必要がありlistオブジェクトを削除できるようにするには。

+0

Okは、スローでコピーが得られるので、リストを削除してから削除できますか?この特定のケースでは – wutzebaer

+0

@wutzebaer - はい。しかし、別のケースでは、リストに値でオブジェクトが含まれている場合、このリストを削除すると余分なオーバーヘッド(オブジェクトを新しいリストにコピーし、古いリストから削除する)が得られ、ポインタでリストをスロットに渡す方が簡単です。 – ikleschenkov

+0

@ikleschenkov Qtコンテナは、コピーオンライトで暗黙的に共有されます。リストをコピーすると、その要素のすべてが自動的にコピーされません。 – Angew

0

listは((はい、汚いハック)delete &list;あなたは可能性がある場合には - 唯一の直接接続の場合)*listに(同じ)のポインタや参照ではないとしていいえ、それは不可能だし、値によって渡されます代わりに。

なぜ最初にリストを動的に割り当てるのですか?

1

あなたが書いたとおりではありません。 listパラメータは値渡しですので、ポインタlistが指すリストのコピーです(2つの変数に別個の名前を付けておけば、質問の明確さに役立ちます)。

slotListを参照(slotList(QList<MyClass> &list))でパラメータにするよう変更したとしても、内部ではdelete &listにはまだ適していません。それはQtであるため、シグナル接続(キューに入れられた接続やスレッド間の接続など)は信号のパラメータ上ではなく、そのコピー上で直接動作します。

、何らかの理由で、あなたがスロットにクリエーター信号からリストの所有権を伝播し、そこにそれを削除する必要がある場合は、代わりにポインタを受け入れるためのスロットを変更する必要があります。

QList<MyClass *> *row = new QList<MyClass *>(); 
... 
emit listReady(row); 

void OtherClass::slotList(QList<MyClass> *list) { 
    ... 
    delete list; 
} 

しかし、最も重要なのは、なぜ実際にQListを最初に動的に割り当てるのですか?コンテナ(QListなど)は、ほとんどの場合、動的割り当てを必要としません。暗黙的な共有とコピーオンライトで実装されているQtコンテナではさらに多くのことが成り立ちます。したがって、QListをコピーするだけでも安く(その内容はコピーされません)。したがって、正しい解決策は、rowをポインタの代わりにオブジェクトにして、new/deleteのビジネス全体を忘れてしまう可能性があります。

関連する問題