访问冲突试图使用std ::复制元素创建矢量从一个磁盘阵列

问题描述 投票:0回答:2

我的工作是在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.");
        });
    });
}
stdvector access-violation c++-cx
2个回答
0
投票

我注意到,载体是被发送到trackmeshes之前正确(tasks.push_back(_trackMeshes [I] - > InitializeAsync(部分));),但他们由TAKS实际开始的时间空。

所以我想,他们走出去的范围出于某种原因?

余存储在成员变量的部分向量(标准::矢量>份)并以某种方式,修复的一切。

如果有人可以解释这样对我,我会庆祝,作为正确答案


0
投票

问题是你想它已被删除后访问一个局部变量。看到这里(其他代码删除):

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的异步部分运行将是访问内存中删除。

© www.soinside.com 2019 - 2024. All rights reserved.