2013-02-12 14 views
5

XCode 4.6'da iOS için geliştiriyorum. Bir hizmet için kütüphane yazıyorum ve iş parçacığı başlatmak için destek kullanın. Benim yöntemlerden biri şuna benzer:Hatalı Erişim arttığında :: gelecek <>. Sonra() geleceğe eriştikten sonra

void Service::start(boost::shared_ptr<ResultListener> listener) { 

    boost::future<bool> con = boost::make_future(true); 
    listener->onConnected(); // Works 
    boost::future<bool> initDone = con.then([&, listener](boost::future<bool>& connected) { 
     listener->onConnected(); // Works 
     if (!connected.get()) { 
      listener->onError("..."); 
      return false; 
     } 
     listener->onError("..."); // EXC_BAD_ACCESS 
     /* ... */ 
     return true; 
    }); 
} 

cihazında bu yürütme ben işaretli hattında bir EXC_BAD_ACCESS olsun. onConnected numaralı çağrıya yapılan ilk çağrı başarılı olduğundan ve onError numaralı telefonu arayarak if numaralı telefonu aramadan önce bile çok şaşırıyorum.

C++ ile oldukça deneyimsiz olmak Nedenin ne olduğu, nasıl hata ayıklanacağı ve bu sorunun bir dahaki sefere nasıl çıkacağının nasıl olacağı hakkında her bilgi parçasından memnun olurum. Ayrıca hangi bilgilerin uygun olduğundan emin değilim. Şimdiye kadar bulduklarımdan ne düşündüğümle alakalı olabilir, aşağıdakiler olabilir: ResultListener ve Serviceboost::noncopyable. shared_ptr (use_count kullanarak) referans sayısını kontrol ettim ve devamlılık içinde artar. 1.53 desteğini kullanıyorum. yöntem bu

Servuce reco(/* ... */); 
boost::shared_ptr<foo> f(new foo()); 
reco.start(f); 

foo bir yöntem denir ama eğer std::cout yazdırmak başka hiçbir şey yapmaz basit bir sınıf olmak gibi denir.

Düzenleme:

// retrieving the value 
    move_dest_type get() 
    { 
     if(!this->future_) 
     { 
      boost::throw_exception(future_uninitialized()); 
     } 

     future_ptr fut_=this->future_; 
     this->future_.reset(); 
     return fut_->get(); 
    } 

bu sorun olduğunu düşünüyorum: Ayrıca beni get() çağrıyı incelemek için izin vermedi ve ben yürütülmektedir future.hpp aşağıdaki kodu bulundu etrafta geziniyorlar. reset() numaralı çağrı, future_shared_ptr'un belleğini boşaltır gibi görünüyor. Benim tahminim, bu durumun devam etmesi, hala işletim sistemi için kullanılmadığı şekilde çalışmakta olduğu belleğe işaret ediyor ve dolayısıyla kapsamı dışında bellek erişimi olarak kaçak olan listener işaretçisini geçersiz kılıyor. Bu varsayım doğru mu? Bunu bir şekilde önleyebilir miyim, yoksa bu bir hata mıdır?

Düzenleme 2: aşağıdaki sorunu yaratan minimal örnektir:

#define BOOST_THREAD_VERSION 4 
#include <boost/thread.hpp> 

class Test { 

public: 
    void test() { 
     boost::shared_ptr<Test> listener(new Test()); 
     boost::future<bool> con = boost::make_future(true); 
     listener->foo(); // Works 
     boost::future<bool> initDone = con.then([listener](boost::future<bool>& connected) { 
      listener->foo(); // Works 
      if (!connected.get()) { 
       listener->foo(); 
       return false; 
      } 
      listener->foo(); // EXC_BAD_ACCESS 
      return true; 
     }); 
    } 

    void foo() { 
     std::cout << "foo"; 
    } 
}; 

ben Devam, çalıştığı gelecekte durumu göstermek için XCode aldı ve öyle görünüyor iki ekran görüntüsü eklendi Mankarnas'ın (yorumlarda) ve ben (yukarıda) doğru olduğu: Sürekliliğin saklandığı ve dolayısıyla tanımlanmamış davranışların meydana geldiği hafıza kısmı gibi görünüyor.

Bu

get() önce durum denir geçerli: Situation after <code>get</code> was called

adresi px işaret ettiği sonradan 0x00 edilir: Situation before <code>get</code> is called

Bu get() denirdi sonra durumdur.

+0

'onError' seçeneğini kontrol ettiniz mi? – inf

+0

Ne demek istediniz? Hatalı kod içeriyor mu? Std :: cout << "foo"; 'den oluşur ve geleceğe dair get()' çağrısından önce “onError” a çağrı yaparsam çalışır. – Stephan

+0

Listener.get() işlevi, kilitlenen satırdan önce null değil mi? (Sorunu yerel olarak üretemiyorum; sorunu sizin için sergileyen bir _complete_ testcase oluşturabilirseniz muhtemelen yardımcı olacaktır, bu yüzden tarif etmediğiniz bölümleri tahmin etmek zorunda değilim). – Mankarse

cevap

2

Hata olarak 1,53 and it was confirmed numaralı hataya karşı bir bilet açtım. Görünüşe göre future.then henüz sabit değil ve bu nedenle üretim için kullanıma hazır değil.oradan bir danışma

#define BOOST_THREAD_DONT_PROVIDE_FUTURE_INVALID_AFTER_GET 

kullanmaktı Ama açıkça bu özellik kararlı olmadığını henüz (ve dokümantasyon bu bilgi biraz eksik olduğu) ifade edilmiştir.

Şimdi geleceği bekleyeceğim ve sonra uygun eylemleri gerçekleştireceğim ayrı bir iş parçacığı kullanmak için şimdi değiştirdim.

İlgili konular