最も基本的なエクササイザー プログラムに変換された、質問で指定されたコードを次に示します。
class myLinkedList {
private:
myLinkedList* next;
int m_value;
public:
myLinkedList() : next(0), m_value(0) { }
int getValue() const { return m_value; }
void setValue(int value) { m_value = value; }
void addNext(int value) { next = new myLinkedList; next->setValue(value); }
const myLinkedList *getNext() const { return next; }
};
#include <iostream>
static void print_list(const myLinkedList *rover)
{
std::cout << "List:";
while (rover != 0)
{
std::cout << " " << rover->getValue();
rover = rover->getNext();
}
std::cout << std::endl;
}
int main()
{
myLinkedList mine;
print_list(&mine);
mine.addNext(13);
print_list(&mine);
mine.addNext(14);
print_list(&mine);
mine.setValue(3);
print_list(&mine);
mine.addNext(15);
print_list(&mine);
}
このプログラムの出力は次のとおりです。
List: 0
List: 0 13
List: 0 14
List: 3 14
List: 3 15
ご覧のとおり、これは通常のリンク リストではありません。これは、最大 2 つの項目のリストです。の下でプログラム (ll
リンクされたリストに対して呼び出される) を実行すると、次のvalgrind
ようになります。
==31288== Memcheck, a memory error detector
==31288== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==31288== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==31288== Command: ll
==31288==
List: 0
List: 0 13
List: 0 14
List: 3 14
List: 3 15
==31288==
==31288== HEAP SUMMARY:
==31288== in use at exit: 6,239 bytes in 36 blocks
==31288== total heap usage: 36 allocs, 0 frees, 6,239 bytes allocated
==31288==
==31288== LEAK SUMMARY:
==31288== definitely lost: 48 bytes in 3 blocks
==31288== indirectly lost: 0 bytes in 0 blocks
==31288== possibly lost: 0 bytes in 0 blocks
==31288== still reachable: 6,191 bytes in 33 blocks
==31288== suppressed: 0 bytes in 0 blocks
==31288== Rerun with --leak-check=full to see details of leaked memory
==31288==
==31288== For counts of detected and suppressed errors, rerun with: -v
==31288== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 1 from 1)
コードが機能するリンク リストの実装である場合、 でタイミングの問題が発生しaddNext()
ます。
基本的に、でノードを作成し、new
それをリストにフックする必要があります。別のスレッドが同時にそれを行おうとすると、タイミング ウィンドウが発生し、構造の一貫性が失われる可能性があります。スレッド セーフのために、リストの変更中に相互排除を確保する必要があります。