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 Service
boost::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:

adresi px
işaret ettiği sonradan 0x00
edilir:
Bu get()
denirdi sonra durumdur.
'onError' seçeneğini kontrol ettiniz mi? – inf
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
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