Yazılımımızda 1.58 ve VS2013'ü yükseltmek için güncellediğimden beri çökmeler görüyorum. Sadece derleyici optimizasyonu açık olduğunda çökmeleri görürüz. 1.55 desteği ile kaza olmaz. Ben boost::any_range
için gördüğüm sorunu ve nasıl kullandığımızı ayırmayı başardım. AşağıdaBu bir Visual Studio 2013 güncelleştirmesi 4 C++ en iyileştirici hatası mı yoksa kodum yanlış mı?
#include <boost/range/any_range.hpp>
#include <boost/range/adaptor/transformed.hpp>
#include <vector>
#include <memory>
#include <cstdio>
class DummyElement
{
public:
float f_;
};
using ElementRange = boost::any_range < DummyElement*, boost::bidirectional_traversal_tag >;
using DummyElementUPtr = std::unique_ptr <DummyElement> ;
class BoostAnyTest
{
public:
BoostAnyTest()
{
for (int i = 0; i < 10; ++i)
{
auto element = DummyElementUPtr(new DummyElement());
_tprintf(_T("BoostAnyTest::ctor() 0x%p\n"), element.get());
c_.emplace_back(std::tuple<Int, DummyElementUPtr>(i, std::move(element)));
}
}
public:
ElementRange GetAll();
private:
using _ContainerType = std::vector < std::tuple<Int, std::unique_ptr<DummyElement>> > ;
_ContainerType c_;
};
ElementRange
BoostAnyTest::GetAll()
{
auto transform = [ ] (const _ContainerType::value_type& v) -> DummyElement*
{
return std::get<1>(v).get();
};
return c_ | boost::adaptors::transformed(transform);
}
int
main()
{
BoostAnyTest any;
auto range = any.GetAll();
std::for_each(std::begin(range), std::end(range), [ ] (DummyElement* element)
{
_tprintf(_T("TestBoostAnyRange() 0x%p\n"), element);
});
}
program çıkarılır:
aşağıdaki örnek kod bakın. DEBUG versiyonu çıktı ne beklemek, ancak optimize AÇIKLAMASI versiyonu şu anda bana gizlememiz olduğunu ...DEBUG version output:
BoostAnyTest::ctor() 0x007D0FB0
BoostAnyTest::ctor() 0x007D0E30
BoostAnyTest::ctor() 0x007D0E60
BoostAnyTest::ctor() 0x007D1160
BoostAnyTest::ctor() 0x007D0E90
BoostAnyTest::ctor() 0x007D10A0
BoostAnyTest::ctor() 0x007D0F80
BoostAnyTest::ctor() 0x007D0FE0
BoostAnyTest::ctor() 0x007D1010
BoostAnyTest::ctor() 0x007D1040
TestBoostAnyRange() 0x007D0FB0
TestBoostAnyRange() 0x007D0E30
TestBoostAnyRange() 0x007D0E60
TestBoostAnyRange() 0x007D1160
TestBoostAnyRange() 0x007D0E90
TestBoostAnyRange() 0x007D10A0
TestBoostAnyRange() 0x007D0F80
TestBoostAnyRange() 0x007D0FE0
TestBoostAnyRange() 0x007D1010
TestBoostAnyRange() 0x007D1040
RELEASE version output:
BoostAnyTest::ctor() 0x00BFA358
BoostAnyTest::ctor() 0x00BFA238
BoostAnyTest::ctor() 0x00BFA3E8
BoostAnyTest::ctor() 0x00BFA248
BoostAnyTest::ctor() 0x00BFA258
BoostAnyTest::ctor() 0x00BFA268
BoostAnyTest::ctor() 0x00C2ECB8
BoostAnyTest::ctor() 0x00C2ED98
BoostAnyTest::ctor() 0x00C2EDA8
BoostAnyTest::ctor() 0x00C2ED48
TestBoostAnyRange() 0x00A5FCE0
TestBoostAnyRange() 0x00A5FCE0
TestBoostAnyRange() 0x00A5FCE0
TestBoostAnyRange() 0x00A5FCE0
TestBoostAnyRange() 0x00A5FCE0
TestBoostAnyRange() 0x00A5FCE0
TestBoostAnyRange() 0x00A5FCE0
TestBoostAnyRange() 0x00A5FCE0
TestBoostAnyRange() 0x00A5FCE0
TestBoostAnyRange() 0x00A5FCE0
Belki benim kodu yanlış veya gerçekten optimizer bir hata nedir? Herhangi bir ipucu çok takdir edilecektir!
'_ContainerType' ayrılmış bir addır (çünkü bir alt harfi ve ardından büyük harfle başlar). Yine de senin sorunun ile ilgili değil. – dyp
Bir derleyici hatası gibi görünmüyor: http://coliru.stacked-crooked.com/a/edcdb838034085ca – dyp
Lütfen çok küçük bir test çantası sunun. Bir "ana" işlevi olurdu. Ayrıca ... derleyici uyarılarınızı açın !!!!!!!!!!!!!! –