visual studioで、unique_ptrを使っているときに予期せぬところでメモリアクセス違反が起こる
環境はViausl Studio 2015 communityです。
以下のようなファイルと、
#include "intRect.hpp"
int main()
{
std::cout << "declare..." << std::endl;
intRect rectangle;
rectangle.setSize(10, 5);
std::cout << "set value..." << std::endl;
// set value
for (int x = 0; x < 10; x++)
{
for (int y = 0; y < 5; y++)
{
rectangle.setValue(x, y, x + y);
}
}
std::cout << "printing..." << std::endl;
// print value
for (int x = 0; x < 10; x++)
{
for (int y = 0; y < 5; y++)
{
rectangle.printValue(x, y);
}
}
return 0;
}
以下のようなインクルードファイルがあるのですが、
#ifndef INTRECT_HPP
#define INTRECT_HPP
#include <memory>
#include <iostream>
struct intRect
{
int width = 0;
int height = 0;
int size = 0;
//std::unique_ptr<int[]> intrect_body = nullptr;
std::unique_ptr<int> intrect_body;
void setSize(const int arg_width, const int arg_height)
{
width = arg_width;
height = arg_height;
intrect_body.reset(new int(width * height));
}
void setValue(const int& arg_x, const int& arg_y, const int& arg_value)
{
if (width == 0 || height == 0)
{
return;
}
int position = arg_y * width + arg_x;
if (position > width * height)
{
return;
}
intrect_body.get()[position] = arg_value;
}
void printValue(const int& arg_x, const int& arg_y)
{
if (width == 0 || height == 0)
{
return;
}
int position = arg_y * width + arg_x;
if (position > width * height)
{
return;
}
std::cout << "value at position (" << arg_x << ", " << arg_y << ") is " << intrect_body.get()[position] << std::endl;
}
};
#endif
以下の画像のように、止まるところがおかしなところで、勝手にリソースが解放されてしまっているようにも見えるのですが、原因がわかりません。
アウトプットには
Exception thrown at 0x0F6FB4E4 (ucrtbased.dll) in smapowraptest.exe: 0xC0000005: Access violation reading location 0x000003B2.
と表示されています。
Exception thrown at 0x775A324F (ntdll.dll) in smapowraptest.exe: 0xC0000005: Access violation reading location 0x00000009.
と表示されることもあり、挙動がよくわからない状態になります。
MSYS2でg++でコンパイルして流すと、正常に動くのですが、何か間違っているのでしょうか。