class ObjFactory { map<string, weak_ptr<Obj>> lookup_; public: shared_ptr<Obj> get(const string &name) { auto it = lookup_.find(name); if (it != lookup_.end()) { shared_ptr<Obj> obj((it->second).lock()); return obj; } shared_ptr<Obj> instance(new Obj(name)); weak_ptr<Obj> obj(instance); lookup_[name] = obj; return instance; } };
看起來沒什麼問題,不過譽到以下這種情況就爛了
1 2 3 4 5 6 7 8 9 10
for (int i = 0; i < 3; i++) { shared_ptr<Obj> s = pFactory->get("HM"); if (s) { cout << "create new obj" << endl; } else { cout << "cannot create new obj" << endl; } }
int func() { static int i, state = 0; switch (state) { case 0: goto LABEL0; case 1: goto LABEL1; } LABEL0: for (i = 0; i < 10; i++) { state = 1; return i; LABEL1:; } return -1; }
int main() { IntVector v; for (int i = 0; i < 100; i++) v.set(i, i); transform(v.begin(), v.end(), v.begin(), [](int v) { return v * 2; }); for (int& i : v) { i *= 2; } for (const int& i : v) { cout << i << endl; } }
// Send the sequence 2, 3, 4, ... to channel 'ch'. func Generate(ch chan<- int) { for i := 2; ; i++ { ch <- i // Send 'i' to channel 'ch'. } }
// Copy the values from channel 'in' to channel 'out', // removing those divisible by 'prime'. func Filter(in <-chan int, out chan<- int, prime int) { for { i := <-in // Receive value from 'in'. if i%prime != 0 { out <- i // Send 'i' to 'out'. } } }
// The prime sieve: Daisy-chain Filter processes. func main() { ch := make(chan int) // Create a new channel. go Generate(ch) // Launch Generate goroutine. for i := 0; i < 10; i++ { prime := <-ch fmt.Println(prime) ch1 := make(chan int) go Filter(ch, ch1, prime) ch = ch1 } }