2016-11-30 4 views
-2

ポインタリストの値を別のポインタリストにコピーしようとしています。最初のポインタの割り当てを削除すると、値は2番目のリストに残りません。私はこれが具体的にはポインタのリストであり、アドレスが実際の値ではなくコピーされていることを知っています。私はこれをやってどうやって行くのだろうと思っていた。ポインタを持つ別のstdリストへのポインタを持つstdリストをコピーする

次は私のコードです:

#include <iostream> 
#include <list> 


int main(int argc, char const *argv[]) 
{ 
    std::list<int*> pointer_list; 

    std::list<int*> int_list; 


    int one, two, three, four, five; 

    one = 1; 
    two = 2; 
    three = 3; 
    four = 4; 
    five = 5; 

    pointer_list.push_back(new int(one)); 
    pointer_list.push_back(new int(two)); 
    pointer_list.push_back(new int(three)); 
    pointer_list.push_back(new int(four)); 
    pointer_list.push_back(new int(five)); 



    for (std::list<int*>::iterator iterator = pointer_list.begin(), end = pointer_list.end(); iterator != end; ++iterator) 
    { 
    std::cout << **iterator << std::endl; 
    } 

    for (std::list<int*>::iterator iterator = pointer_list.begin(), end = pointer_list.end(); iterator != end; ++iterator) 
    { 
    int_list.push_back(*iterator); 
    } 

    for (std::list<int*>::iterator iterator = pointer_list.begin(), end = pointer_list.end(); iterator != end; ++iterator) 
    { 
    delete *iterator; 
    } 

    for (std::list<int*>::iterator iterator = int_list.begin(), end = int_list.end(); iterator != end; ++iterator) 
    { 
    std::cout << "INT_LIST_AFTER DELETE: " << **iterator << std::endl; 
    } 

    for (std::list<int*>::iterator iterator = pointer_list.begin(), end = pointer_list.end(); iterator != end; ++iterator) 
    { 
    std::cout << "LIST_POINTER AFTER DELETE: " << **iterator << std::endl; 
    } 


    return 0; 
} 

次のように出力されます。

1 
    2 
    3 
    4 
    5 
    INT_LIST_AFTER DELETE: 1469317922 
    INT_LIST_AFTER DELETE: 1469317925 
    INT_LIST_AFTER DELETE: 1469317928 
    INT_LIST_AFTER DELETE: 0 
    INT_LIST_AFTER DELETE: 5 
    LIST_POINTER AFTER DELETE: 1469317922 
    LIST_POINTER AFTER DELETE: 1469317925 
    LIST_POINTER AFTER DELETE: 1469317928 
    LIST_POINTER AFTER DELETE: 0 
    LIST_POINTER AFTER DELETE: 5 

はまた、どのように私は最後の要素を削除するに行きますか?リストを反復すると、条件iterator != endがそれを防止し、リストの性質のために<=を使用することはできません。 std::vectorまたはstd::listなどのSTLコンテナでポインタを所有している保存

+3

なぜポインタを格納していますか?あなたが 'int'を扱っているだけなら、それらを使用してポインタをドロップしてください。 – NathanOliver

+2

「どうやってこれをやっていくのだろうか」と思っていた。あなたはすでに問題を特定しました。あなたはぶら下がっているポインタでいっぱいのリストを持っています。ですから、ポインタを使わないでも、 'int *'の代わりに 'std :: shared_ptr 'のようなリスト間で共有できるものを使ってもかまいません。 – WhozCraig

+0

可能であれば、別のポインタのリストのディープコピーを実装しようとしています。 –

答えて

1

はバグや「leaktrocities」(例えば、例外がスローされた場合のSTLコンテナのデストラクタが勝った」として、割り当てられたリソースが、漏洩しているの源であります生の所有ポインタを解放する)。
あなたはスマートポインタを(あなたは一生に注意を払っているのであれば観察生のポインタが、問題あり)を保存し、または使用する必要がありますどちらか。

あなたが本当にSTLコンテナ内のポインタを保存したい、とあなたは共有所有権がセマンティックたい場合は、std::shared_ptrを検討する必要があります。例えば。 std::list<std::shared_ptr<T>>list<shared_ptr<int>>)をご利用いただけます。 参照カウントに変換されます、あなたがコピー操作を行うことができ、この場合、

操作(例えば、何かが、代わりにディープコピーのコピーされたとき、あなたは増加した参照カウントを取得し、それがすべて自動的に std::shared_ptrによって管理されます) 。

+0

助けてくれてありがとうと感謝していませんでしたが、私の問題に対する答えは:int temp = ** iterator; int_list.push_back(新しいint(temp)); –

+0

はい、しかし、生のポインタをSTLコンテナに保存しようとすると、OPが実行しようとしているコピーの種類は、(追加の)エイリアシングを作成しないため、実行するべき種類です。 –

+0

ありがとうございました@John Bollinger –

関連する問題