我的工作是在UWP项目中引用的C ++ / CX的DirectX项目。
下面的函数是C ++ / CX项目的一部分,从一开始就UWP项目叫,主要是创建一些网格。
一切工作正常,直到我改变有一个_trackMesh
如此,相反,它是一个包含多个网格,一个std::vector (_trackMeshes)
。 (基本上我想分手了网格,每个网格中的最大点数)。
但是,当我试图分裂包含所有点阵列I设置localPlayerId
之后,但在年底前获得访问冲突。我不知道为什么。
任何帮助非常赞赏。
码:
IAsyncAction^ Track3DControl::InitializeAsync(const Array<TrackPoint>^ trackPoints, const Array<IPlayer^>^ players, int localPlayerId)
{
_logger->Trace(L"InitializeAsync()");
_isInitialized = false;
Utilities::Copy(trackPoints, _trackPoints);
int pointCount = trackPoints->Length;
const int maxPointCount = 5000;
int count = (int)ceil(pointCount / (double)maxPointCount);
_logger->Error("_trackMeshes count: " + count);
_trackMeshes = ref new Array<TrackMesh^>(count);
for (int i = 0; i < count; i++)
{
_trackMeshes[i] = ref new TrackMesh(_logger, _d3dDevice, _d3dContext);
}
std::vector<task<void>> tasks;
for (int i = 0; i < count; i++)
{
int start = i * maxPointCount;
int end = (i + 1)*maxPointCount;
if (end > pointCount)
{
end = pointCount;// -1;
}
std::vector<TrackPoint> part(end);
for (size_t j = 0; j < end-start; j++)
{
part[j] = _trackPoints[j+ start];
}
tasks.push_back(_trackMeshes[i]->InitializeAsync(&part));
}
for (auto index = 0u; index < static_cast<unsigned int>(_playerMeshes.size()); ++index)
{
tasks.push_back(_playerMeshes.at(index)->InitializeAsync(_playerModel.get()));
}
_localPlayerId = localPlayerId;
return create_async([this, tasks]
{
return when_all(tasks.begin(), tasks.end()).then([this]
{
_isInitialized = true;
_logger->Trace(L"Initialized.");
});
});
}
我注意到,载体是被发送到trackmeshes之前正确(tasks.push_back(_trackMeshes [I] - > InitializeAsync(部分));),但他们由TAKS实际开始的时间空。
所以我想,他们走出去的范围出于某种原因?
余存储在成员变量的部分向量(标准::矢量>份)并以某种方式,修复的一切。
如果有人可以解释这样对我,我会庆祝,作为正确答案
问题是你想它已被删除后访问一个局部变量。看到这里(其他代码删除):
for (int i = 0; i < count; i++)
{
std::vector<TrackPoint> part(end); // <-- part created here
tasks.push_back(_trackMeshes[i]->InitializeAsync(&part));
} // <-- part destroyed here
围绕循环每次构造part
,通过它的地址InitializeAsync
,然后将其删除。无论你的代码已经在InitializeAsync
的异步部分运行将是访问内存中删除。