Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику 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
Почему здесь
static_cast<TestClass*>(arrPtr) + sizeof(TestClass)
вы вдруг прибавляете sizeof(TestClass)
???
Следующий элемент массива - это просто
static_cast<TestClass*>(arrPtr) + 1
смещение происходит не на размер класса, а на один байт,
Не ясно, про какой "один байт" вы ведете речь. Смещение в вашем варианте происходит на sizeof(TestClass) * sizeof(TestClass)
байт.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Ниже представлен рабочий код, но почему-то выводятся лишние нули после DОбъясните почему так происходит?
Как можно средствами C++ развернуть свернутую программу и сделать её окно активным?