アクセス違反
ウバタマ  2016/02/24(Wed) 17:17
Siv3Dの使い方を学んでいるのですが、以下のようなコードを書くとDebugでは何も問題が起きないのに、Releaseにするとアクセス違反が発生します。

//コードここから
#include <Siv3D.hpp>
#include <list>

using namespace std;

void Main()
{
Graphics::SetBackground(Color(80, 160, 230));

list<Sphere> s;//球のリスト

while (System::Update())
{
Graphics3D::FreeCamera();

Disc(0, -1, 0, 30).draw(Palette::Red);

if (System::FrameCount() % 10 == 0)//10フレーム毎に球を作る
{
s.push_back(Sphere(0, 0, 0, 1));
}

for (auto it = s.begin(); it != s.end();)//作られた球を移動、描画する
{
it->moveBy(1, 0, 0);
it->draw();
if (it->x > 30)//一定距離進んだら消す
{
it = s.erase(it);
continue;
}
it++;
}
}
}
//コードここまで
10フレーム毎に球を追加し、一定距離進んだら消すプログラム。
it->draw()の辺りでアクセス違反が起きているようなのですが、どこが悪いんでしょうか?
記事編集
Reputeless  2016/02/24(Wed) 19:16
Siv3D のバージョンは何ですか?
編集
ウバタマ  2016/02/24(Wed) 20:15
前のバージョンのJune2015v2です
編集
Reputeless  2016/02/24(Wed) 20:52
x86 では std::list のアロケータが Sphere の 16 バイトアライメントに対応していないためです。
std::list<Sphere, s3d::AlignedAllocator<Sphere>> を使用するか、Siv3D January 2016 の x64 版にアップデートしてください。
編集
ウバタマ  2016/02/24(Wed) 20:59
そうだったのですか、わかりました。
返答ありがとうございました。
編集
ウバタマ  2016/02/24(Wed) 21:08
Sphere* s = new Sphere()
というような感じでも起きるのですが同じ理由なのでしょうか?
どのように回避すればいいのでしょうか?
編集
Reputeless  2016/02/24(Wed) 22:19
Sphere* pShere = AlignedMalloc<Sphere>(1); // 要素数
AlignedFree(pShere);
を使用してください。

要素数が数千個以下であれば、std::list<Sphere> でなく Array<Sphere> を検討して見るのも良いと思います。
Array は アライメント対応版の std::vector です。
編集
ウバタマ  2016/02/24(Wed) 22:32
ありがとうございました!使ってみようと思います!
編集
件名
Re: アクセス違反
名前
コメント
画像添付


投稿修正キー (投稿を修正する時に使います)
画像認証 (右画像の数字を入力) 投稿キー

- WEB PATIO -