Новый останавливает мой объект работает правильно

Мне пришлось полностью переписать эту проблему, так как теперь я узнал о ней намного больше.

Фон:

Моя программа рисует некоторые 3d-объекты в DirectX11. У меня есть класс, который содержит данные, указатели и функции, необходимые для рисования необходимых трехмерных объектов. Все работало хорошо. Я мог бы создавать много разных трехмерных объектов и рисовать их где угодно. Большой!

Затем мне нужно было поместить их в контейнер и в вектор, чтобы мне не нужно было создавать каждый объект вручную, вот тут-то и началась проблема; это будет сбой 1 раз в 5 или около того.

Unhandled exception at 0x00C308C1 in SpritesNTextN3D.exe: 0xC0000005: Access violation reading location 0xFFFFFFFF.

Сбой при использовании векторов и карт. Я продолжил эту строку запроса и попытался использовать указатель и новый:

ThreeD_Cube* threed_cube_p;
threed_cube_p = new ThreeD_Cube;

Это также вызвало сбой при запуске функции рисования.

threed_cube_p->draw(threeD, camera, d3dContext_mp);

Однако, если создан как стандартный объект:

ThreeD_Cube threed_cube_;

Функция рисования никогда не падает.

threed_cube_-.draw(threeD, camera, d3dContext_mp);

Аналогично, создание указателя на threed_cube_ работает как положено.

Вопрос:

Что нового делает то, что конструктор по умолчанию не. Есть ли что-то, на что я должен обратить внимание, чтобы решить эту проблему?

1

Решение

Кажется, у вас есть хороший конструктор, но плохой / недостаточный (по умолчанию) оператор присваивания и плохой / недостаточный (по умолчанию) конструктор копирования.

Давайте посмотрим, почему некоторые части вашего кода работают, а некоторые нет:

//threed_cube_vec[0].draw(threeD, camera, d3dContext_); // doesnt work!!!

Он говорит вам, что в threed_cube_vec [0] плохой / поврежденный объект.

ThreeD_Cube test  = threed_cube_vec[0]; // But, if I copy it...

В этой строке (по некоторым причинам) сначала вызывается конструктор, который дает вам хороший объект. Затем вызывается «=», частично объект изменяется, но объект все еще хорош, так как до «=» он уже был хорош

ThreeD_Cube* test = &threed_cube_vec[0];

Что касается указателя, то это, по сути, сам объект threed_cube_vec [0], поэтому он все еще поврежден.

ThreeD_Cube test  = threed_cube_vec[0];
vector<ThreeD_Cube> test2;
test2.push_back(test);
test2[0].draw(threeD, camera, d3dContext_);

Это не решает проблему, как вы сказали. «test» — хороший объект, но когда вы помещаете push_back (test) в test2, копия отодвигается назад [если вы измените ее на test2.push_back (std :: move (test), проблема может исчезнуть). Конструктор копирования не завершен, объект в test2 [0] поврежден. Аналогичный сценарий происходит с вашей картой.

Вывод: если объект возник из конструктора, вы получите хороший объект; если объект возник из конструктора копирования, он поврежден.

Быстрый тест, который вы можете сделать: измените размер вектора после его объявления, ошибка должна быть временно устранена.

1

Другие решения

Сбой после m = XMMatrixIdentity () — aligment памяти в классах?

В этой теме описан ответ на мою проблему. В конце концов я отследил его до XMMATRIX, вызвав новые сбои из-за выравнивания памяти.

Вот сокращенная версия проблемы:

void matrix_test_pointer()
{
XMMATRIX* xmmatrix_p;
xmmatrix_p = new XMMATRIX;
*xmmatrix_p = XMMatrixIdentity(); // this is where it crashes
}

void matrix_test()
{
XMMATRIX xmmatrix;
xmmatrix = XMMatrixIdentity();
}

int main()
{
string wait;

matrix_test();
cout << "matrix_test() completed.\n";
matrix_test_pointer();
cout << "matrix_test_pointer() completed.\n"; // If it does you are lucky :)

cin >> wait;
return 0;
}

Скорее всего, matrix_test завершится, но произойдет сбой до завершения указателя.

0

По вопросам рекламы [email protected]