Обращение к элементам массива при использовании operator new[](size_t _Size) [закрыт]

197
14 августа 2021, 15:10
Закрыт. Этот вопрос не по теме. Ответы на него в данный момент не принимаются.

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском.

Закрыт 1 год назад.

Улучшить вопрос

Начал разбираться с placement new и столкнулся с непонятным для меня поведением. Допустим у меня есть простой класс (код исключительно тестовый)

{
public:
  TestClass() : a(1) {}
  TestClass(int in) : a(in) {}
  ~TestClass() {}
  void SetA(int in) { a = in; }
  int GetA() { return a; }
private:
  int a;
};

далее создаю два массива разными способами

  TestClass * arr1 = new TestClass[2];
  arr1[0].SetA(1);
  arr1[1].SetA(2);
  void * arrPtr = ::operator new[](sizeof(TestClass) * 2);
  TestClass * arr2 = new (arrPtr) TestClass(10);
  new (static_cast<TestClass*>(arrPtr) + sizeof(TestClass)) TestClass(20);

при обращении к элементам первого массива проблем не возникает

  std::cout << arr1[0].GetA() << std::endl;
  std::cout << arr1[1].GetA() << std::endl;
результат:
1
2

но при аналогичном обращении ко второму массиву резульат следующий

  std::cout << arr2[0].GetA() << std::endl;
  std::cout << arr2[1].GetA() << std::endl;
  std::cout << arr2[4].GetA() << std::endl;
результат:
10
-842150451
20

то есть смещение происходит не на размер класса, а на один байт, хотя типы указателей одинаковые. Объясните, пожалуйста, по какой причине так происходит (желательно максимально подробно)?

P.s. Использовал visual studio 17

Answer 1

Почему здесь

static_cast<TestClass*>(arrPtr) + sizeof(TestClass)

вы вдруг прибавляете sizeof(TestClass)???

Следующий элемент массива - это просто

static_cast<TestClass*>(arrPtr) + 1

смещение происходит не на размер класса, а на один байт,

Не ясно, про какой "один байт" вы ведете речь. Смещение в вашем варианте происходит на sizeof(TestClass) * sizeof(TestClass) байт.

READ ALSO
циклический сдвиг битов вправо

циклический сдвиг битов вправо

Ниже представлен рабочий код, но почему-то выводятся лишние нули после DОбъясните почему так происходит?

163
C++, вопрос про безопасность offsetof

C++, вопрос про безопасность offsetof

Я бы хотел прояснить следующий момент

124
Почему-то не создается окно в ImGui

Почему-то не создается окно в ImGui

Почему-то не создается окноЯ новичок в ImGui

144
Развернуть свернутое окно

Развернуть свернутое окно

Как можно средствами C++ развернуть свернутую программу и сделать её окно активным?

91