Я понимаю, что оператор placement new позволяет создавать объект в определенном/конкретном месте памяти. Итак, я попробовал это;
#include <iostream>
#include <new>
using namespace std;
struct Any {
int x;
string y;
};
int main() {
string mem1[1];
int mem2[5];
Any *p1 = new (mem1) Any;
Any *p2 = new (mem2) Any;
p1->y = "Hello";
//p2->x = 20;
cout << p1->y << endl;
//cout << p2->x;
return 0;
}
Я понял, что я могу установить строку в место, которое я выделил для хранения ровно 1 строки, но я не могу сделать то же самое для целого числа, подобного этому;
int mem2[1];
Any *p2 = new (mem2) Any;
p2->x = 20;
Я получаю сообщение об ошибке переполнения буфера, хотя мне удается показать значение, которое я поместил в это место, которое равно 20
;
Почему?
Кроме того, с моим полным кодом, показанным выше, я выделил 2 разных места в памяти для хранения 2 объектов, которые позволяют p1->y
печатать без каких-либо проблем. Но когда я уменьшаю это местоположение
int mem2[5];
на любое число ниже 5
, которое, я думаю, не имеет ничего общего с местом, где я поместил строку и попытаюсь напечатать строку, я получаю ошибку ошибки сегментации. Почему >= 5
? Это связано с доступной памятью?
Есть ли способ проверить успешность использования оператора placement new для размещения объекта в определенном месте памяти?
Any
в массивеstring
илиint
- person AndyG   schedule 08.11.2016Any
помещается в пространство, в которое вы пытаетесь его поместить.mem1
определенно слишком мал. Другая проблема заключается в том, что деструктор для строки вызывается в конце ее области видимости, поэтому вам придется восстанавливатьmem1
до концаmain
. - person Bo Persson   schedule 08.11.2016x = 20; cout << x;
просто вcout << 20;
и не записывать ничего вx
. Так что это не очень хороший тест на работоспособность. - person Bo Persson   schedule 08.11.2016catch
его, и неопределенное поведение не может быть обнаружено по определению. - person Mark Ransom   schedule 08.11.2016Any
объект не помещается вmem1
, поэтому он работает нормально. Когда я уменьшаю «mem2» до любого числа ниже5
, я получаю ошибки при попытке напечатать то, что находится вmem1
. Вот почему я в замешательстве! - person Paa K   schedule 08.11.2016